Asp.net Unity 1.2内部类型的依赖项注入

Asp.net Unity 1.2内部类型的依赖项注入,asp.net,dependency-injection,unity-container,application-blocks,Asp.net,Dependency Injection,Unity Container,Application Blocks,我在一个库中有一个facade,它通过一个简单的接口公开了一些复杂的功能。我的问题是如何为facade中使用的内部类型进行依赖项注入。假设我的C#库代码看起来像- public class XYZfacade:IFacade { [Dependency] internal IType1 type1 { get; set; } [Dependency] internal IType2 type2 {

我在一个库中有一个facade,它通过一个简单的接口公开了一些复杂的功能。我的问题是如何为facade中使用的内部类型进行依赖项注入。假设我的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>();
IUnityContainer container=newunitycontainer();
container.RegisterType();
container.RegisterType();
container.RegisterType();
...
...
IFacade facade=container.Resolve();

这里facade.SomeFunction()抛出异常,因为facade.type1和facade.type2为null。感谢您的帮助

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

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

不建议注入内部类

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

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创建一个接口。

不建议注入内部类

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

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创建一个接口。

但是如果我将[assembly:InternalsVisibleTo(“Microsoft.Practices.Unity”)]设置为[assembly:InternalsVisibleTo(“Microsoft.Practicess.Unity”)]不起作用吗?我怀疑这一点,因为Microsoft.Practicess.Unity不是调用程序集,您的容器创建是。但是如果我将[assembly:InternalsVisibleTo(“Microsoft.Practicess.Unity”)]这不应该奏效吗?我怀疑,因为Microsoft.Practices.Unity不是调用程序集,而是您创建的容器。这仍然意味着IType1和Type1都是公共的,不是吗?如果我不想把这些暴露在图书馆外面怎么办。是否有一种方法可以使它们保持在内部,并且仍然执行依赖项注入。在这种情况下,您可以将FactoryClass中的属性设置为内部属性。我会认真考虑使用国际VISILTO,你可以在网络上搜索所有的原因,而不是使用它(类似于C++好友的概念)。Hmm.。我无法实现公共接口且具有内部属性。InternalsVisibleTo似乎不起作用,所以现在不是一个选项。这仍然意味着IType1和Type1都是公共的,不是吗?如果我不想把这些暴露在图书馆外面怎么办。是否有一种方法可以使它们保持在内部,并且仍然执行依赖项注入。在这种情况下,您可以将FactoryClass中的属性设置为内部属性。我会认真考虑使用国际VISILTO,你可以在网络上搜索所有的原因,而不是使用它(类似于C++好友的概念)。Hmm.。我无法实现公共接口且具有内部属性。InternalsVisibleTo似乎不起作用,因此目前无法选择。