统一注册内部课程?

问题描述 投票:2回答:2

如何在统一容器中注册来自不同程序集的内部类?

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

如果InternalClassImpl可以在它的程序集之外访问,那么效果很好,但如果它是内部的,并且实现了IPublicInterface,那么唯一真正的替代方案似乎是提供一个可以创建它们的工厂。

但是如果你有一个工厂创建类,你怎么能继续使用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需要从Large Application和内部SmallLibrary类注入依赖项,会发生什么?

c# unity-container
2个回答
4
投票

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

-1
投票

虽然接受的答案符合我的需要,但我认为另一种方法是让工厂方法采用容器。

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

注册工厂方法时,c代表统一容器!

LargeApplication

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

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

© www.soinside.com 2019 - 2024. All rights reserved.