更新
此行为在Simple Injector 2中发生了变化:初始化程序现在也将在Func<T>
注册时触发。原因是 Simple Injector 现在有明确的生活方式支持,现在实际上表现得像 StructureMap(如下所述)。
你的观察是正确的。Simple Injector 文档是这样描述的:
注意:容器将无法在使用new
运算符手动构造的类型上调用初始化委托。尽可能使用自动构造函数注入。
克服这个问题的最好方法是允许 Simple Injector 使用自动构造函数注入。
你NotifyCustomerHandler
需要一个string
构造函数参数,这使得无法进行自动构造函数注入。你NotifyCustomerHandler
似乎有多重责任。通过将通知服务隐藏在INotificationService
接口后面并让处理程序依赖于该接口,从处理程序功能中抽象出通知服务。您可以将该配置值注入到通知服务中。
关于 Simple Injector 以这种方式运行的一些背景信息
尽管其他 DI 框架(例如StructureMap及其OnCreationForAll
方法)即使在您新建类型时也会调用委托,但 Simple Injector 不会。这是由于框架期望用户注册生活方式的差异造成的。
使用 StructureMap,生活方式是通过显式调用该LifecycleIs
方法来配置的。使用 Simple Injector,用户应该通过注册自己实现生活方式的代表来配置生活方式。例如查看文档中的Per Thread 生活方式示例。使用 StructureMap 它是为您控制生命周期的框架,而使用 Simple Injector 它通常取决于用户。
换句话说,StructureMap 期望注册的委托总是创建一个新实例,而 Simple Injector 没有这种期望。因为 StructureMap 期望返回一个新实例,所以它可以在调用委托后安全地初始化该对象。实例的缓存在其他地方完成。然而,Simple Injector不会对从此类委托返回的对象调用初始化程序,因为这可能会一遍又一遍地重新初始化同一个对象,这可能会导致意外的应用程序行为和可能的性能问题。
我希望这有帮助。