Unity Newbie Question - PullRequest
       10

Unity Newbie Question

1 голос
/ 25 июня 2009

Я пытаюсь использовать Unity в первый раз и думаю, что мог откусить больше, чем смогу пережевывать. У нас есть n-уровневое приложение, которое имеет базовую библиотеку с несколькими абстрактными типами, а затем несколько библиотек, специфичных для бизнес-сценариев, с конкретными типами. Например: у абстрактного типа есть две реализации, одна в NewAutomotiveLibrary с именем NewAutomotiveLead, а другая в AutomotiveFinanceLibrary с именем AutomotiveFinanceLead. В базовой библиотеке у нас есть набор адаптеров, которые выполняют логику для базовых типов, таких как Lead.

Я впервые пытаюсь использовать Unity для возврата интерфейса ILeadDuplication, который при разрешении возвращает либо экземпляр NewAutomotiveLeadDuplication, либо AutomotiveFinanceLeadDuplication, когда я вызывал resolv для ILeadDuplication, и передает либо строковое значение либо «NewAutomotive», либо « AutomotiveFinance "(имена отображаются при вызове RegisterType для контейнера). Вот так:

  using (IUnityContainer container = new UnityContainer())
  {
    container
      .RegisterType<ILeadDuplication, AutomotiveFinanceLeadDuplication>("AutomotiveFinance")
      .RegisterType<ILeadDuplication, NewAutomotiveLeadDuplication>("NewAutomotive");

    ILeadDuplication dupe = container.Resolve<ILeadDuplication>("AutomotiveFinance");
    Console.WriteLine(dupe.Created);
  }

ПРИМЕЧАНИЕ. Это для иллюстрации, поскольку библиотека ничего не знает о классах concreate для ILeadDuplication, поэтому фактическую регистрацию необходимо выполнить в файле конфигурации.

Хотя все это прекрасно работает, мне нужно сделать еще один шаг вперед. При вызове resolver мне нужно передать аргумент типа Lead, который является базовым типом для NewAutomotiveLead или AutomotiveFinanceLead.

Мне нужно знать, возможно ли, чтобы Unity каким-то волшебным образом выглядела свойство, специфичное для конкретного экземпляра AutomotiveFinanceLead, такого как "GrossMonthlyIncome", который не существует в Lead, и назначило его новому созданному свойству экземпляров AutomotiveFinanceLeadDuplication GrossMonthlyIncome.

Мне бы очень хотелось иметь возможность выполнять общий набор логики для экземпляров ILeadDuplication в базовой библиотеке, даже если бы создаваемые экземпляры и отображаемые свойства были ей незнакомы.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 июня 2009

Я не понимаю, почему вы хотите, чтобы контейнер нес такую ​​ответственность. Но я думаю, что вы могли бы сделать это так:

Непосредственно перед вызовом Resolve () для получения нового экземпляра ILeadDuplication вы можете зарегистрировать экземпляр Lead для использования и значение GrossMonthlyIncome для использования:

  Lead lead = new NewAutomotiveLead()
  container.RegisterInstance<Lead>(lead);
  container.RegisterInstance<int>("GrossMonthlyIncome", lead.GrossMonthlyIncome);
  ILeadDuplication dupe = container.Resolve<ILeadDuplication>("AutomotiveFinance");

Если конкретный тип имеет зависимость с именем «GrossMonthlyIncome», значение будет введено туда. Если конструктор конкретного типа принимает экземпляр Lead, экземпляр будет внедрен в этот параметр конструктора.

0 голосов
/ 25 июня 2009

Не совсем уверен, что вы ищете, но я предполагаю, что вы хотите передать зависимость во время построения. Это можно сделать разными способами, но вот пример.

[InjectionConstructor]
public class MyClass([Dependency("Named")] MyOtherClass other)
{

}

для того, чтобы это работало, зависимость MyOtherClass с именем «Named» должна находиться в контейнере либо через конфигурацию, либо путем добавления ее через метод RegisterType.

Дайте мне знать, если я не в базе и, возможно, я смогу помочь вам в дальнейшем ... Я довольно много работал с Unity в разных ситуациях, так что пока я знаю, чего вы хотите достичь, я мог бы помочь тебя нет.

...