城堡windsor决议管道与Unity作为子解析器

Geo*_*ica 7 c# castle-windsor ioc-container unity-container

简而言之,我试图将Castle Windsor容器与Unity容器联系起来.让我解释一下背景:

我有一个项目,很长一段时间它使用城堡windsor.几天前,我得到了一些我必须从我的旧项目中消耗/使用的dll.这些DLL使用Unity Container作为其注入机制.我也可以访问这些dll中的接口/实现,但我不会尝试实例化手动实现,但我更愿意,如果可能的话,将Unity容器与我当前的城堡windsor容器相关联.我怎么能实现这个目标?

所以,如果我有:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我IService和windsor IThirdPartyService一起解决,那么另一个容器要解决它会很好:Unity.

谢谢!.

Gil*_*een 6

我认为这是使用自定义的完美示例ISubDependencyResolver。每当Castle不知道如何解决特定的依赖关系时,它将解决该自定义解析器。新的解析器将依赖于Unity容器,并将使用它来解析“ for”城堡。

Castle的文档指出:

如果以前的位置无法解析依赖项解析器,则会询问其每个子解析器(ISubDependencyResolver)是否可以提供依赖项。

因此,当在Castle中找不到该依赖项时,它将寻求您的新解析器来提供依赖项。

这是构造函数注入属性注入的工作示例:

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; }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

至于检查的代码UnityCanResolve-我敢肯定,这可以改善-我不知道多少关于统一