统一注册内部课程?

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类的注入依赖项,会发生什么情况?

Bac*_*cks 6

你需要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)

  • @RyanTheLeach可以通过`Extension` calss的构造函数传递LifeTimeManager并使用它。并像这样注册`container.AddExtension(new Extension(new PerResolvelifeTimeManager()));` (2认同)