gpt4 book ai didi

c# - 使用 Unity 作为子解析器的 CaSTLe windsor 解析管道

转载 作者:太空狗 更新时间:2023-10-29 20:30:02 25 4
gpt4 key购买 nike

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

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

如果我有:

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

}
}

如果我用 windsor 解析 IService,那么 ITirdPartyService 最好由另一个容器:Unity 解析。

谢谢!

最佳答案

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

Castle's documentation指出:

If previous places weren't able to resolve the dependency resolver will ask each of its sub resolvers (ISubDependencyResolver) if they can provide the dependency.

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

这是一个同时使用构造函数注入(inject)属性注入(inject)的工作示例:

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

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

关于c# - 使用 Unity 作为子解析器的 CaSTLe windsor 解析管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39872961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com