使用UNITY覆盖对象参数

时间:2011-09-25 09:02:03

标签: c# unity-container ioc-container

我已经开始了一个项目,我们将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>(); 
}

1 个答案:

答案 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} });"