переопределение параметров объекта с использованием UNITY - PullRequest
1 голос
/ 25 сентября 2011

Я запустил проект, использующий 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) Как настроить тип Tab вединицей, чтобы я мог передать значение true или false свойству AllowVisible в качестве параметра?Я не хочу добавлять дополнительную строку tab.AllowVisible = true; , как в случае ниже

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

2) Если у меня уже есть экземпляр ViewModel, такойкак vm в приведенном ниже примере, как заставить контейнер разрешить объект Tab при передаче объекта vm в его конструктор?В настоящее время, когда я определяю для объекта tab , контейнер создает другой экземпляр ViewModel. Я хочу, чтобы экземпляр vm использовался в качестве модели представления объектов вкладки?

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

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

1 Ответ

3 голосов
/ 25 сентября 2011

Если вы автоматически хотите присвоить значение свойству AllowVisible вашей реализации ITab, тогда вы можете использовать тип InjectionProperty , предоставленный Unity.

Вы можете сделать это беглоНапример:

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

Что касается второй части вашего вопроса, вы должны передать параметры конструктора (IViewModel) методу Unity Resolve (...) при определении реализации для ITab.

Этот вопрос уже задавался ранее в SO, посмотрите:

Могу ли я передать параметры конструктора в метод Unity Resolve ()?

Для полноты картины:

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