【问题标题】:Castle windsor resolution pipeline with Unity as sub resolver使用 Unity 作为子解析器的 Castle Windsor 解析管道
【发布时间】:2017-02-13 20:08:29
【问题描述】:

简而言之,我正在尝试将 Castle Windsor 容器与 Unitycontainer 链接。让我解释一下上下文:

我有一个项目在很长一段时间内都使用了温莎城堡。几天前,我从旧项目中得到了一堆我必须使用/使用的 dll。这些 DLL 使用 Unity Container 作为其注入机制。我还可以访问在这些 dll 中找到的接口/实现,但我不会尝试手动实例化实现,但如果可能的话,我更愿意将 Unity 容器与我当前的城堡温莎容器链接起来。我怎么能做到这一点?

如果我有:

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

    }
}

如果我用 Windsor 解决 IService,那么 IThirdPartyService 由另一个容器解决会很好:Unity。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    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; }
    }
    

    结果:

    至于检查UnityCanResolve 的代码 - 我确信它可以改进 - 我对 Unity 了解不多

    【讨论】:

    • 我试过这个。想法是……城堡如何知道他必须通过属性注入来注入特定的接口?他能知道的唯一方法是在依赖映射中拥有该接口。否则他甚至不会尝试注入它。
    • @GeorgeLica - 至于属性注入,在我看来这不是问题 - See documentation
    • @Alexandru Marculescu - 请考虑奖励赏金 :) 答案解决了这个问题
    • @GeorgeLica - 上述解决方案是否帮助您解决问题?
    猜你喜欢
    • 2012-06-06
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多