注册Unity的内部课程



如何在Unity容器中从其他组件中注册内部类?

UnityContainer container = new UnityContainer();
container.RegisterType<IPublicInterface, InternalClassImpl>(new ContainerControlledLifetimeManager());

如果InternalClassimpl在汇编之外可以访问,但是如果它是内部的,并且实现了IpublicInterface,那么唯一真正的替代方案似乎是提供可以创建它们的工厂。

但是,如果您有一个工厂创建班级,如何继续使用统一依赖注入来注入依赖项?

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需要从大型应用和内部小盲目类注入依赖项,会发生什么?

您需要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>();
}

虽然接受的答案适合我的需求,但我认为另一种选择是让工厂方法取容器。

public class InternalClassImplFactory
    {
        public static IPublicInterface MakeInternalClassImpl(IUnityContainer container)
        {
            return new InternalClassImpl();
        }
    }

注册工厂方法时,C表示Unity容器!

LargeApplication

container.RegisterType<IPublicInterface>(new InjectionFactory(c =>
InternalClassImplFactory.MakeInternalClassImpl(c)));

因此,您可以让工厂创建一个儿童容器,解决依赖关系或您需要的任何东西。

最新更新