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.
谢谢!.
我认为这是使用自定义的完美示例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)
结果:
至于检查的代码Unity为CanResolve-我敢肯定,这可以改善-我不知道多少关于统一
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |