2016-10-05 3 views
7

Вкратце, я пытаюсь связать контейнер Castle Windsor с контейнером Unity. Позвольте мне объяснить контекст:Контур разрешения ветрового контура с единством в качестве вспомогательного резольвера

У меня есть проект, в котором в течение очень долгого времени использовался виндзор замка. Несколько дней назад я получил кучу dll, которые я должен использовать/использовать из своего старого проекта. Эти DLL используют Unity Container как их механизм впрыска. У меня также есть доступ к интерфейсам/реализациям, которые находятся в этих DLL, но я бы не стал пытаться создавать экземпляры вручную, но я бы просто предпочел, если возможно, связать контейнер Unity с моим контейнером Windsor. Как я мог это достичь?

Так что, если у меня есть:

public class MyService: IService 
{ 
    public MyService (IThidPartyService thirdParty) 
    { 

    } 
} 

Если я решаю IService Виндзоре было бы неплохо, что IThirdPartyService быть решена с помощью другого контейнера: Unity.

спасибо !.

ответ

4

Я думаю, что это прекрасный пример использования пользовательского ISubDependencyResolver. Всякий раз, когда Castle не будет знать, как разрешить определенную зависимость, он обратится к этому настраиваемому преобразователю. Этот новый резольвер будет зависеть от контейнера Unity и будет использовать его для разрешения «для» замка.

Castle's documentation утверждает, что:

Если предыдущие места были не в состоянии решить распознаватель зависимость спросит каждого из своих суб резольверами (ISubDependencyResolver), если они могут обеспечить зависимость.

Поэтому, когда эта зависимость не будет найдена в Замке, она будет искать ваш новый резольвер, который обеспечит зависимость.

Вот рабочий пример как с Constructor Injection и инъекций собственности:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var unityContainer = new UnityContainer(); 
     unityContainer.RegisterType<IDependency, Dependency1>(); 
     unityContainer.RegisterType<IPropertyDependency, PropertyDependency1>(); 

     WindsorContainer castleContainer = new WindsorContainer(); 
     castleContainer.Kernel.Resolver.AddSubResolver(new UnityResolver(unityContainer)); 
     castleContainer.Register(
      Component.For<SomeType>()); 

     var result = castleContainer.Resolve<SomeType>(); 
    } 
} 

public interface IDependency { void Foo(); } 
public class Dependency1 : IDependency { public void Foo() { } } 

public interface IPropertyDependency { } 
public class PropertyDependency1 : IPropertyDependency { } 
public class SomeType 
{ 
    public SomeType(IDependency dependency) { ConstructorDependency = dependency; } 

    public IDependency ConstructorDependency { get; private set; } 
    public IPropertyDependency PropertyDependency { get; set; } 
} 

public class UnityResolver : ISubDependencyResolver 
{ 
    public UnityResolver(UnityContainer container) 
    { 
     Container = container; 
    } 
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return Container.Registrations.Any(z => z.RegisteredType.Equals(dependency.TargetType)); 
    } 

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return Container.Resolve(dependency.TargetType); 
    } 

    public UnityContainer Container { get; set; } 
} 

И результат:

enter image description here

Что касается кода для проверки Unity для CanResolve - Я уверен, что его можно улучшить - я не знаю теперь много о Unity

+0

Я пробовал это. Идея такова, что ... КАК завещал знать, что ему нужно вводить определенный интерфейс через инъекцию свойств? Единственный способ, который он мог знать, - это использовать этот интерфейс на карте зависимостей. В противном случае он даже не попытался бы это сделать. –

+0

@GeorgeLica - Что касается инъекции свойств, мне кажется, что это не проблема - [См. Документацию] (https://github.com/castleproject/Windsor/blob/master/docs/how-dependencies-are-resolved .md # how-dependencies-are-resolved) –

+0

@Alexandru Marculescu - Пожалуйста, подумайте о присуждении награды :) Ответ решает этот вопрос –

Смежные вопросы