Rya*_*ach 3 c# unity-container
如何在一个统一的容器中注册来自不同程序集的内部类?
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
如果InternalClassImpl可以在其程序集外部访问,则效果很好,但是,如果在内部并实现IPublicInterface,则唯一可行的选择似乎是提供一个可以创建它们的工厂。
但是,如果您有一家工厂在创建类,那么如何继续将Dependency Injection与Unity一起使用以注入其依赖项?
Large Application
UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl()));
Run Code Online (Sandbox Code Playgroud)
Small Library
namespace SmallLibrary
{
public interface IPublicInterface
{
}
public class InternalClassImplFactory
{
public static IPublicInterface MakeInternalClassImpl()
{
return new InternalClassImpl();
}
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果InternalClassImpl需要大型应用程序和内部SmallLibrary类的注入依赖项,会发生什么情况?
你需要UnityContainerExtension。在定义了内部类的库中创建新扩展。在容器中注册内部类。
public class Extension : UnityContainerExtension
{
protected override void Initialize()
{
Container.RegisterType<IPublicInterface, InternalClassImpl>();
}
}
public interface IPublicInterface
{
}
internal class InternalClassImpl : IPublicInterface
{
public InternalClassImpl()
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过公开实现Extension。因此,您的实现仍然存在,internal但是您可以使用它。
static void Main(string[] args)
{
var container = new UnityContainer();
container.AddNewExtension<Extension>();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |