使用UNITY覆盖对象参数
问题描述:
我已经开始一个项目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>();
}
答
如果你想自动将值分配给您的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} });"