城堡windsor与Unity统一解决方案的解决方案
简而言之,我尝试将Castle Windsor
容器与Unity
容器连接起来。 让我解释一下上下文:
我有一个项目,在很长一段时间里它使用了温莎城堡。 几天前,我收到了一堆我必须从旧项目中使用/使用的dll。 那些DLL使用Unity Container作为注入机制。 我也可以访问在这些DLL中找到的接口/实现,但我不会尝试实例化手动实现,但我只是希望将Unity容器与当前的城堡windsor容器链接起来。 我怎么能做到这一点?
所以如果我有:
public class MyService: IService
{
public MyService (IThidPartyService thirdParty)
{
}
}
如果我用windsor来解析IService
,那么IThirdPartyService
可以被另一个容器解决:Unity。
谢谢!。
我认为这是一个使用定制ISubDependencyResolver
的完美例子。 只要Castle不知道如何解决特定的依赖关系,它就会解决该自定义解析器。 这个新的解析器将取决于Unity Container,并将用它来解决“for”Castle的问题。
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; }
}
结果是:
至于为CanResolve
检查Unity
的代码 - 我相信它可以得到改进 - 我对Unity的了解不多
上一篇: Castle windsor resolution pipeline with Unity as sub resolver