Регистрация Unity: подключение интерфейса к предварительно зарегистрированному конкретному классу - PullRequest
0 голосов
/ 20 октября 2011

У меня уже есть конкретный класс, зарегистрированный в моем контейнере Unity, и я хочу позже зарегистрировать интерфейс, который подключается к этому классу, но использует существующую регистрацию.

Я могу сделать это с помощью следующегокод, но он вызывает разрешение во время регистрации ...

container.RegisterInstance<IMyClass>(container.Resolve<MyClass>());

Возможно ли подключить код ко всем разрешениям, выполненным в точке разрешения интерфейса?

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Хитрость заключается в использовании InjectionFactory:

container.Register<IMyClass>(
    new InjectionFactory(c => c.Resolve<MyClass>()));
0 голосов
/ 20 октября 2011
IUnityContainer container = new UnityContainer();

var onlyInstance = new MyClass();
container.RegisterInstance<IMyClass>(onlyInstance);

IMyClass resolved = container.Resolve<IMyClass>();

if (object.ReferenceEquals(onlyInstance, resolved))
{
    Console.WriteLine("Equal");
}

Это печатает "Равно". Именно так я и зарегистрировал бы экземпляр.

В комментарии выше вы подразумеваете, что не контролируете первоначальную регистрацию. Это реальная проблема. Я бы порекомендовал пойти по одному из следующих путей (в порядке предпочтения, от высшего к низшему):

  • Создайте свой собственный UnityContainer независимо от предварительно зарегистрированного
  • Создать дочерний контейнер с CreateChildContainer
  • Использовать именованные (не по умолчанию) сопоставления
0 голосов
/ 20 октября 2011

Звучит так, будто вы хотите создать фабричный тип. Здесь используется тип делегата Func, чтобы избежать создания нового пользовательского типа фабрики:

container.RegisterInstance<Func<IMyClass>>(() => container.Resolve<MyClass>());

Ваши другие типы могут затем зависеть от этой фабрики:

private IMyClass myClass;

public MyOtherType(Func<IMyClass> myClassFactory)
{
   this.myClass = myClassFactory();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...