Architecture 简单注入器和内部构造函数

Architecture 简单注入器和内部构造函数,architecture,dependency-injection,simple-injector,Architecture,Dependency Injection,Simple Injector,我正在开发一个小型类库,并为我的DI使用简单的注入器。 类库有一个访问点(我猜是某种服务),它是公共的,它有一些内部的服务和存储库 我看到Simple Injector不支持内部构造函数的构造函数注入。 例如,我的产品服务看起来像: internal class ProductService : IProductService { private IProductRepository _productRepository; internal

我正在开发一个小型类库,并为我的DI使用简单的注入器。 类库有一个访问点(我猜是某种服务),它是
公共的
,它有一些
内部的
服务和存储库

我看到Simple Injector不支持内部构造函数的构造函数注入。 例如,我的产品服务看起来像:

     internal class ProductService : IProductService
      {
        private IProductRepository _productRepository;

        internal ProductService(IProductRepository repository)
        {
          if (repository == null) throw new ArgumentNullException("repository");

          _productRepository = repository;
        }

      }
和我的设置:

container.Register<IProductService, ProductService>();
container.Register<IProductRepository>(() => new ProductRepository());
我的问题是:

1) 注入内部类在体系结构/设计方面不起作用有什么具体原因吗


2) 这种行为(对不应该是公共的类使用依赖项注入)是如何实现的?是否需要这种行为?

Simple Injector尝试为您提供一个合理的默认值。默认情况下,它仅限于具有单个公共构造函数的自动布线类型,因为具有。简单注入器默认情况下只注入公共构造函数,因为简单注入器要能够安全地调用类型的构造函数,必须是公共的。例如,当应用程序在(部分信任)沙箱中运行时,Simple Injector将无法调用内部构造函数,尽管可以完全信任地调用内部构造函数,但创建此类类型的速度较慢。为了提高性能,最好将类型和构造函数保持为公共的

除了这些技术限制之外,在正常情况下,组件及其构造函数将是公共的,因为您通常会有需要访问该组件的外部使用者。这样的使用者的例子是您的单元测试项目和应用程序

因此,合理的默认值是“一个公共构造函数”,但类型本身不必是公共的,尽管解析内部类型会比较慢,并且可能并不总是在沙箱中工作。换句话说,当您不在沙箱(如Silverlight或Windows Phone)中运行时,Simple Injector将能够解析内部类型,只要它们有一个公共构造函数。

但是,如果确实需要或希望构造函数是内部的,则可以通过实现和注册自定义的
IConstructor或ResolutionBehavior
来覆盖构造函数解析行为。下面是一个例子:

公共类InternalConstructorResolutionBehavior:IConstructorResolutionBehavior
{
私人IConstructorResolutionBehavior原创;
公共InternalConstructorResolutionBehavior(容器){
this.original=container.Options.ConstructorResolutionBehavior;
}
公共构造函数Info GetConstructor(类型implementationType){
如果(!implementationType.GetConstructors().Any()){
var internalCtors=implementationType.GetConstructors(
BindingFlags.Instance | BindingFlags.NonPublic)
.其中(c=>!c.IsPrivate)
.ToArray();
if(internalCtors.Length==1)返回internalCtors.First();
}
返回this.original.GetConstructor(implementationType);
}
}
可以按如下方式注册此自定义构造函数解析行为:

var container=newcontainer();
container.Options.ConstructorResolutionBehavior=
新的InternalConstructorResolutionBehavior(容器);
//正常注册在这里

这些类是内部类而不是公共类的原因是什么?非常好,感谢您的解释!我将公开我的构造函数(同时将一些类保持在内部)。
For the container to be able to create ProductService, it should contain exactly one public constructor, but it has 0.