私は、UI、BLL、および DAL の典型的な 3 層に構成された WinForms アプリケーションに取り組んでいます。スタートアップ プロジェクトとして機能する別のプロジェクトを作成しました。すべての依存性注入セットアップを実行する目的で、自家製の依存性注入コンテナーとして機能する別のプロジェクトも作成されました。自家製の依存性注入コンテナはスタートアップ プロジェクトによってインスタンス化され、インスタンス化されたオブジェクトが最初の 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 は、次の 2 つのボタン クリック イベントで挿入されたオブジェクトを使用します。
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 つ以上に増えた場合、これは問題になるようです。その後、5 つ以上のパラメーターをスタートアップの WinForm に渡します。個別に注入されたクラスではなく、AppDependencyInjection と呼ばれる自家製の依存性注入コンテナーを WinForm に渡すことにした場合、渡すパラメーターを 1 つだけに制限できます。これを行うと、プレゼンテーション層が自家製の依存性注入プロジェクトに依存するようになり、プレゼンテーション層が BLL と依存性注入プロジェクトの両方に依存するようになります。これは受け入れられますか?アプリケーションで依存性が注入されたクラスの将来の成長に対応するには、他に何ができますか?