如何在统一容器中注册来自不同程序集的内部类?
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());
如果 InternalClassImpl 可以在其程序集外部访问,则效果很好,但如果它是内部的,并且实现了 IPublicInterface,那么唯一真正的替代方案似乎是提供一个可以创建它们的工厂。
但是如果你有一个工厂创建这个类,你怎么能继续使用 Unity 的依赖注入(inject)来注入(inject)它的依赖?
大型应用程序
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl()));
小型图书馆
namespace SmallLibrary
{
public interface IPublicInterface
{
}
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl()
{
return new InternalClassImpl();
}
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
}
但是,如果 InternalClassImpl 需要从大型应用程序和内部 SmallLibrary 类注入(inject)依赖项,会发生什么?
最佳答案
您需要 UnityContainerExtension
。
在定义内部类的库中创建新扩展。在容器中注册您的内部类。
public class Extension : UnityContainerExtension
{
protected override void Initialize()
{
Container.RegisterType<IPublicInterface, InternalClassImpl>();
}
}
public interface IPublicInterface
{
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
现在您可以通过Extension
公开您的实现。
因此,您的实现保留在内部
,但您可以使用它。
static void Main(string[] args)
{
var container = new UnityContainer();
container.AddNewExtension<Extension>();
}
关于c# - 在unity中注册一个内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47806642/