我在容器中注册了一些服务。某些类型依赖于此服务和短生存参数。例如:
Func<int, Foo>
我想要的是一些自动生成工厂来创建这些对象而无需手动编码每个工厂的方法。我可以使用IFooFactory
或创建一些CreateFoo(int entityId)
(使用using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Forms;
public partial class Registration : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void submit_Click(object sender, EventArgs e)
{
Response.Write("Your registration is succesful"); // Not displaying
//MessageBox.Show("Test Display");
}
方法)并且我想让Simple Injector自动生成此工厂的实现(对于任何参数计数以某种通用方式)
有可能吗?
答案 0 :(得分:2)
构建DI库以创建长期服务的对象图。您试图滥用容器来构建一个短命的类。像实体,消息和DTO这样的短命对象通常被称为newables,因为你应该手动新建它们,而不是让你的作品根或容器为你自动连接它们。
如果此Foo
是实体,则依赖项should not be injected into the entity's constructor。应该使用方法注入;一个实体有多个域方法,这些方法应该指定它们所需的依赖关系。调用该域方法的组件可以将这些依赖项注入其构造函数中。在运行时,您可以将这些依赖项传递给实体的方法。
将运行时数据与编译时依赖项混合到类的构造函数中有许多缺点。例如,它使您的对象图难以验证,这肯定适用于注入Func<TParam1, TParam2, Entity>
。例如,一个类接收两个相同类型的参数,例如public Bar(IService1, int a, int b)
,并向消费者注入相应的Func<int, int, Bar>
方法。但是如果Bar
更改为public Bar(IService1, int b, int a)
(a
和b
已交换)会怎样?在这种情况下,代码将在运行时失败;编译器和我们的DI库都无法为我们检测到这一点。
答案 1 :(得分:1)
从SimpleInjector github页面看一下AutomaticParameterizedFactoryExtensionsTests class。它有一个测试方法,解释了如何使用AutomaticParameterizedFactoryExtensions,这似乎是你要求的。
此类位于源代码中的SimpleInjector.CodeSamples项目中。