【问题标题】:Unity 1.2 Dependency injection of internal typesUnity 1.2 内部类型的依赖注入
【发布时间】:2010-06-10 07:33:06
【问题描述】:

我在一个库中有一个外观,它通过一个简单的界面公开一些复杂的功能。我的问题是如何为外观中使用的内部类型进行依赖注入。假设我的 C# 库代码看起来像 -

public class XYZfacade:IFacade
{
    [Dependency]
    internal IType1 type1
    {
        get;
        set;
    }
    [Dependency]
    internal IType2 type2
    {
        get;
        set;
    }
    public string SomeFunction()
    {
        return type1.someString();
    }
}

internal class TypeA
{
....
}
internal class TypeB
{
....
}

我的网站代码就像 -

 IUnityContainer container = new UnityContainer();
 container.RegisterType<IType1, TypeA>();
 container.RegisterType<IType2, TypeB>();
 container.RegisterType<IFacade, XYZFacade>();
 ...
 ...
 IFacade facade = container.Resolve<IFacade>();

这里facade.SomeFunction() 抛出异常,因为facade.type1 和facade.type2 为null。任何帮助表示赞赏。

【问题讨论】:

    标签: asp.net dependency-injection unity-container application-blocks


    【解决方案1】:

    不推荐注入内部类。

    我会在程序集中创建一个公共工厂类,其中声明了内部实现,可用于实例化这些类型:

    public class FactoryClass
    {
       public IType1 FirstDependency
       {
         get
         {
           return new Type1();
         }
       }
    
       public IType2 SecondDependency
       {
         get
         {
           return new Type2();
         }
       }
     }
    

    并且 XYZFacade 中的依赖项将与 FactoryClass 类有关:

    public class XYZfacade:IFacade
    {
       [Dependency]
       public FactoryClass Factory
       {
          get;
          set;
       }
    }
    

    如果您想让它可测试,请为 FactoryClass 创建一个接口。

    【讨论】:

    • 那么这仍然意味着 IType1 和 Type1 都是公共的,不是吗?如果我不想在图书馆外公开这些怎么办。有没有办法让它们保持内部并仍然进行依赖注入。
    • 在这种情况下,您可以从 FactoryClass 内部创建属性。我会认真考虑使用 InternalsVisibleTo,您可以在整个网络上搜索不使用它的原因(类似于 C++ 朋友的概念)。
    • 嗯.. 我无法实现公共接口并具有内部属性。 InternalsVisibleTo 似乎不起作用,因此目前不是一个选项。
    【解决方案2】:

    如果容器创建代码在内部类型的程序集之外,Unity 无法查看和创建它们,因此无法注入依赖项。

    【讨论】:

    • 但是如果我设置 [assembly: InternalsVisibleTo("Microsoft.Practices.Unity")] 不应该工作吗?
    • 我对此表示怀疑,因为 Microsoft.Practices.Unity 不是调用程序集,而是您的容器创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2023-04-07
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多