在unity中注册一个内部class?
Register a internal class in unity?
如何在统一容器中注册来自不同程序集的内部 class?
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());
如果 InternalClassImpl 可以在其程序集外部访问,则效果很好,但如果它是内部的,并且实现了 IPublicInterface,那么唯一真正的替代方案似乎是提供一个可以创建它们的工厂。
但是如果您有一个工厂创建 class,您如何继续使用 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 需要从大型应用程序和内部 SmallLibrary 注入依赖项,会发生什么情况 类?
你需要UnityContainerExtension
。
在定义了内部 class 的库中创建新扩展。在容器中注册您的内部 class。
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>();
}
虽然接受的答案符合我的需要,但我认为另一种方法是让工厂方法获取容器。
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl(IUnityContainer container)
{
return new InternalClassImpl();
}
}
注册工厂方法时,c代表unity容器!
LargeApplication
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl(c)));
所以你可以让工厂创建一个子容器,解决依赖关系或任何你需要的东西。
如何在统一容器中注册来自不同程序集的内部 class?
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());
如果 InternalClassImpl 可以在其程序集外部访问,则效果很好,但如果它是内部的,并且实现了 IPublicInterface,那么唯一真正的替代方案似乎是提供一个可以创建它们的工厂。
但是如果您有一个工厂创建 class,您如何继续使用 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 需要从大型应用程序和内部 SmallLibrary 注入依赖项,会发生什么情况 类?
你需要UnityContainerExtension
。
在定义了内部 class 的库中创建新扩展。在容器中注册您的内部 class。
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>();
}
虽然接受的答案符合我的需要,但我认为另一种方法是让工厂方法获取容器。
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl(IUnityContainer container)
{
return new InternalClassImpl();
}
}
注册工厂方法时,c代表unity容器!
LargeApplication
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl(c)));
所以你可以让工厂创建一个子容器,解决依赖关系或任何你需要的东西。