c# - 在unity中注册一个内部类?

标签 c# unity-container

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

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

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

但是如果你有一个工厂创建这个类,你怎么能继续使用 Unity 的依赖注入(inject)来注入(inject)它的依赖?

大型应用程序

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

小型图书馆

namespace SmallLibrary
{
    public interface IPublicInterface
    {
    }

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

    internal class InternalClassImpl : IPublicInterface
    {
        public InternalClassImpl()
        {
        }
    }
}

但是,如果 InternalClassImpl 需要从大型应用程序和内部 SmallLibrary 类注入(inject)依赖项,会发生什么?

最佳答案

您需要 UnityContainerExtension。 在定义内部类的库中创建新扩展。在容器中注册您的内部类。

public class Extension : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IPublicInterface, InternalClassImpl>();
    }
}


public interface IPublicInterface
{
}

internal class InternalClassImpl : IPublicInterface
{
    public InternalClassImpl()
    {
    }
}

现在您可以通过Extension 公开您的实现。 因此,您的实现保留在内部,但您可以使用它。

static void Main(string[] args)
{
    var container = new UnityContainer();
    container.AddNewExtension<Extension>();
}

关于c# - 在unity中注册一个内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47806642/

相关文章:

c# - 使用 UpdateAsync 方法 ASP.NET Entity Framework

c# - Unity InjectionFactory 不运行

c# - Windows 服务上的 Unity DI,可能吗?

c# - 带有 DataReader 的 AutoMapper DynamicMap 针对接口(interface)

inversion-of-control - Unity IoC 与 ASP.NET MVC5

c# - MVC 5 Unity 构造函数注入(inject)失败/返回 Null

c# - 使用 HttpClient 发布自定义类型

c# - 从 C# 调用 dll 函数时的 PInvokeStackImbalance

c# - 如何将字符串数组转换为通用数组类型,同时允许非数组和数组作为类的通用类型参数?

c# - 通过 Fiddler 向 asp.net mvc 操作发送 POST 请求