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

时间:2016-10-05 11:38:37

标签: c# unity-container castle-windsor ioc-container

简而言之,我正在尝试将this.db.openDatabase({ name: 'example.db', location: 'default', // the location field is required createFromLocation: 1, existingDatabase: true, }); 容器与Castle Windsor容器相关联。让我解释一下背景:

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

所以,如果我有:

Unity

如果我用windsor解决public class MyService: IService { public MyService (IThidPartyService thirdParty) { } } ,那么IService由另一个容器解决将会很好:Unity。

谢谢!。

1 个答案:

答案 0 :(得分:4)

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

Castle's documentation声明:

  

如果之前的地方无法解析依赖项解析程序   如果它们将询问每个子解析器(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; }
}

结果:

enter image description here

至于Unity检查CanResolve的代码 - 我确定可以改进 - 我不太了解Unity