我希望我能從社區獲得一些關于在特定場景中使用 DI 容器的指導。我是 DI 容器的新手,并且一直在學習 Autofac,我計劃在一個新的 Winforms 專案中實作它。我理解使用 DI 容器背后的概念,在組合根中構建物件圖,而不是在所述根之外參考容器。但是,我無法想象如何應用以下內容:
- 應用程式希望 Windows 用戶在 DB 中有一個應用程式用戶設定,并且它與他們的 Windows 登錄名匹配
- 因此,當用戶啟動應用程式時,應用程式首先要檢查用戶是否有應用程式用戶。
問題:
- 在整個應用程式中參考此用戶物件的最佳做法是什么?我應該在應用程式啟動時僅參考它一次并將其注入到依賴它的所有物件的建構式中嗎?或者我應該使用 IUserRepo 類在子用戶控制元件和子表單中根據需要從資料庫中重新查詢用戶,該類本身將通過 autofac 注入?
- 如果我應該在開始時只查詢一次并使用 DI 容器注入它,我不知道該怎么做。我只能設想在構建物件圖之前查詢用戶,但這對我來說似乎很奇怪,因為我不會使用 DI 容器并且必須直接參考 userRepo。
主要的
using Autofac;
using System;
using System.Windows.Forms;
namespace MyWinformsApplication
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Should I get the Application user object here and pass it through to
//the conatiner ContainerConfig.Configure() function?
var container = ContainerConfig.Configure(Properties.Settings.Default.Environment);
using (ILifetimeScope scope = container.BeginLifetimeScope())
{
var app = scope.Resolve<IMyApp>();
app.Run();
}
}
}
}
容器配置
public static class ContainerConfig
{
//Should I create a parameter here and pass the user object
//through then base the container build off of it?
public static IContainer Configure(EnvironmentEnum environment)
{
var builder = new ContainerBuilder();
//build logic (excluded for brevity)
return builder.Build();
}
}
謝謝你。
uj5u.com熱心網友回復:
我認為您應該將您的類設計為直接依賴于UserorIUser型別。對我來說,這清楚地記錄了您的課程實際需要什么。你可以依賴一個IUserRepository,但我覺得這會創建一個“不透明的依賴”,因為你真正想要的是用戶。
然后,您可以通過多種方式連接這種型別的解析度:
- 您可以查詢或使用存盤庫來獲取用戶的實體并注冊該實體。然后這個確切的實體將被注入到依賴它的所有型別中。這里的缺點是,如果您的用戶資料在應用程式運行時發生更改,則在重新啟動之前它不會重繪 。
- 您可以注冊一個工廠方法來獲取用戶的實體。這是一個有趣的選項,因為您可以使用注冊的生命周期來控制查詢用戶的頻率。使用單例生命周期在每個容器的生命周期中獲取一次,或者使用瞬態以便每次都對其進行查詢。顯然各有利弊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/497234.html
下一篇:使按鈕與另一個按鈕動態保持距離
