我已经开始了一个项目,我们将MS Unity作为我的IOC容器,并且有两个关于覆盖参数的问题。
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)如何在Unity中设置 Tab 类型,以便我可以将true或false传递给 AllowVisible 属性作为参数?我不想要添加 附加行 tab.AllowVisible = true; ,如下面的情况
void Main()
{
ITab tab = unityContainer.RegisterType<ITab, Tab>();
tab.AllowVisible = true;
}
2)如果我已经拥有ViewModel的实例,例如下面的 vm ,我该如何让容器解析标签< / strong>将 vm 对象传入其构造函数时的对象?目前,当我解析标签对象时,容器会创建另一个ViewModel实例。 我希望将vm实例用作标签对象viewmodel?
void Main()
{
unityContainer.RegisterType<IViewModel, ViewModel>();
unityContainer.RegisterType<ITab, Tab>();
ViewModel vm = unityContainer.Resolve<IViewModel>();
ITab tab = unityContainer.RegisterType<ITab, Tab>();
}
答案 0 :(得分:3)
如果您想自动为ITab实施的AllowVisible属性分配值,则可以使用Unity提供的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(...)方法。
之前已经问过这个问题,请查看:
Can I pass constructor parameters to Unity's Resolve() method?
为了完整起见:
var viewModel = container.Resolve<IViewModel>();
container.Resolve<ITab>(new ParameterOverrides<Tab> { { "vm", viewModel} });"