Asp.net Unity 1.2内部类型的依赖项注入
我在一个库中有一个facade,它通过一个简单的接口公开了一些复杂的功能。我的问题是如何为facade中使用的内部类型进行依赖项注入。假设我的C#库代码看起来像-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 {
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似乎不起作用,因此目前无法选择。