我正在开发一个 WinForms 应用程序,该应用程序已配置为典型的 3 层 UI、BLL 和 DAL。我创建了一个单独的项目作为启动项目。还创建了另一个项目作为自制的依赖注入容器,目的是执行所有依赖注入设置。自制的依赖注入容器由启动项目实例化,然后将实例化对象传递给第一个 WinForm。
自制的依赖注入容器实现如下所示:
public class AppDependencyInjection
{
public BLL.DataServices.DepartmentDataServices BllDeptDataServices = null;
private DAL.DataServices.DepartmentDataServices DalDeptDataServices = null;
public BLL.ReportServices.RequestReports BllRequestReports = null;
private DAL.ReportServices.RequestReports DalRequestReports = null;
public AppDependencyInjection()
{
DalDeptDataServices = new DAL.DataServices.DepartmentDataServices();
BllDeptDataServices = new BLL.DataServices.DepartmentDataServices(DalDeptDataServices);//inject actual implementations
DalRequestReports = new DAL.ReportServices.RequestReports();
BllRequestReports = new BLL.ReportServices.RequestReports(DalRequestReports);//inject actual implementations
}
}
启动项目如下图所示:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//instantiate dependent classes and inject into class constructors
AppDependencyInjection aDI = new AppDependencyInjection();
//Pass objects with injected dependencies into app startup WinForm
Application.Run(new MDIS.WinForms.UI.Form1(aDI.BllDeptDataServices, aDI.BllRequestReports));
}
接收 WinForm 使用注入的对象进行如下实例化:
public Form1(BLL.DataServices.DepartmentDataServices aBllDeptDataServices,
BLL.ReportServices.RequestReports aBllRequestReports)
{
InitializeComponent();
BllDeptDataServices = aBllDeptDataServices;
BllRequestReports = aBllRequestReports;
}
WinForm 在以下两个按钮单击事件中使用注入的对象:
private void btnGetAllDepartments_Click(object sender, EventArgs e)
{
List<DepartmentDto> aDepartmentDtoList = BllDeptDataServices.GetAllDepartments();
}
private void btnGetAllRequests_Click(object sender, EventArgs e)
{
List<RequestDetailDto> aRequestDetailDtoList = BllRequestReports.GetAllRequestDetail();
}
这目前没有太大问题,因为我只传递了 2 个注入的对象。但是,如果对象的数量增长到超过 5 个,这似乎是一个问题,那么我将向启动 WinForm 传递超过 5 个参数。如果我决定将名为 AppDependencyInjection 的自制依赖注入容器而不是单独的注入类传递给 WinForm,我可以将要传递的参数限制为一个。如果我这样做,它将使表示层依赖于自制的依赖注入项目,从而使表示层同时依赖于 BLL 和依赖注入项目。这可以接受吗?我还能做些什么来适应应用程序中依赖注入类的未来增长?