如何在统一容器中注册来自不同程序集的内部类?
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());
如果在其程序集之外可以访问InternalClassImpl,那么效果很好,但如果它是内部的,并且实现了IPublicInterface,那么唯一真正的替代方案就是提供一个可以创建它们的工厂。
但是如果你有一个创建类的工厂,你怎么能继续使用Unity的依赖注入来注入它的依赖?
Large Application
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl()));
Small Library
namespace SmallLibrary
{
public interface IPublicInterface
{
}
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl()
{
return new InternalClassImpl();
}
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
}
但是,如果InternalClassImpl需要从Large Application和内部SmallLibrary类中注入依赖项,会发生什么?
答案 0 :(得分:5)
您需要UnityContainerExtension
。
在库中创建新的扩展,其中定义了内部类。在容器中注册您的内部类。
public class Extension : UnityContainerExtension
{
protected override void Initialize()
{
Container.RegisterType<IPublicInterface, InternalClassImpl>();
}
}
public interface IPublicInterface
{
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
现在,您可以通过Extension
公开您的实施。
因此,您的实施保持internal
但您可以使用它。
static void Main(string[] args)
{
var container = new UnityContainer();
container.AddNewExtension<Extension>();
}
答案 1 :(得分:-1)
虽然接受的答案符合我的需要,但我认为另一种方法是让工厂方法采用容器。
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl(IUnityContainer container)
{
return new InternalClassImpl();
}
}
注册工厂方法时,c代表统一容器!
LargeApplication
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl(c)));
因此,您可以让工厂创建子容器,解决依赖关系或任何您需要的东西。