2011-09-25 90 views
1

我已經開始一個項目usinjg MS Unity作爲我的IOC容器,並且有兩個關於覆蓋參數的問題。使用UNITY覆蓋對象參數

public interface ITab 
{ 
    bool AllowVisible {get;set;} 
} 

class Tab : ITab 
{ 
    IViewModel vm; 

    public Tab(IViewModel vm) 
    { 
    this.vm = vm; 
    } 

    public bool allowVisible = false; 

    public bool AllowVisible 
    { 
    get{ return allowVisible}; 
    set{ allowVisible = vlaue}; 
    } 
} 

public interface IViewModule 
{ 
    string Name; 
} 

public class ViewModel 
{ 
    public string Name; 
} 

1)如何設置了團結的標籤類型,這樣我就可以在真或假傳遞給AllowVisible財產作爲paramater?我不想要添加 附加行tab.AllowVisible = true;如下

void Main() 
{ 
    ITab tab = unityContainer.RegisterType<ITab, Tab>(); 
    tab.AllowVisible = true; 
} 

2)的情況下,如果我已經有視圖模型的實例,例如VM在下面的情況下,如何使該容器解決標籤對象而將vm對象傳遞給它的構造函數?目前,當我解決了標籤對象時,容器創建視圖模型的另一個實例。 我想讓vm實例用作tab對象viewmodel?

void Main() 
{ 
    unityContainer.RegisterType<IViewModel, ViewModel>(); 
    unityContainer.RegisterType<ITab, Tab>(); 

    ViewModel vm = unityContainer.Resolve<IViewModel>(); 
    ITab tab = unityContainer.RegisterType<ITab, Tab>(); 
} 

回答

3

如果你想自動將值分配給您的ITAB實施AllowVisible財產,那麼你可以使用統一提供的InjectionProperty type

你可以說一口流利的方式做到這一點,例如:

IUnityContainer myContainer = new UnityContainer(); 
myContainer.Configure<InjectedMembers>() 
      .ConfigureInjectionFor<MyObject>(
       new InjectionProperty("MyProperty"), 
       new InjectionProperty("MyStringProperty", "SomeText")) 
); 

有點混凝土:

container.RegisterType<ITab, Tab>(); 
container.RegisterType<ITab, Tab>(
    new InjectionProperty("AllowVisible", true) 
); 

有關如何注入構造函數的參數,屬性值的詳細信息...等檢查:

http://msdn.microsoft.com/en-us/library/ff650036.aspx

對於塞科當你解決一個ITab的實現時,你必須將構造函數參數(IViewModel)傳遞給Unity的Resolve(...)方法。

這個問題已經被問過的SO,退房:

Can I pass constructor parameters to Unity's Resolve() method?

爲了完整性:

var viewModel = container.Resolve<IViewModel>(); 
container.Resolve<ITab>(new ParameterOverrides<Tab> { { "vm", viewModel} });"