1 回答

TA貢獻1884條經驗 獲得超4個贊
讓我們從特定于 ASP.NET 的IUserContext注冊開始:
container.Register<IUserContext>(() => {
User user = null;
try {
user = HttpContext.Current?.Session[USER_CONTEXT] as IUser;
}
catch { }
return new UserContext(user);
});
這種注冊是有問題的,因為UserContext組件依賴于運行時數據的可用性,而正如此處所述,對象圖的創建應該與運行時數據分開,并且運行時數據應該流經系統。
換句話說,您應該將您的UserContext課程重寫為以下內容:
public class AspNetUserContext : IUserContext
{
User CurrentUser => (User)HttpContext.Current.Session[USER_CONTEXT];
}
這允許IUserContext按如下方式注冊此特定于 ASP.NET 的實現:
container.RegisterInstance<IUserContext>(new AspNetUserContext());
當然,前面的并沒有解決你的Windows Service中的問題,但是前面的確實為解決這個問題打下了基礎。
對于 Windows 服務,您還需要自定義實現(適配器):
public class ServiceUserContext : IUserContext
{
User CurrentUser { get; set; }
}
這個實現要簡單得多,這里ServiceUserContext的CurrentUser屬性是一個可寫屬性。這優雅地解決了您的問題,因為您現在可以執行以下操作:
// Windows Service Registration:
container.Register<IUserContext, ServiceUserContext>(Lifestyle.Scoped);
container.Register<ServiceUserContext>(Lifestyle.Scoped);
// Code in the new Thread:
using (container.BeginLifetimeScope())
{
.....
var userContext = container.GetInstance<ServiceUserContext>();
// Set the user of the scoped ServiceUserContext
userContext.CurrentUser = GetUserContext(message);
var handler = container.GetInstance<IHandleMessages<SomeMessage>>();
handler.Handle(message);
.....
}
在這里,解決方案也是將對象圖的創建與運行時數據的使用分開。在這種情況下,運行時數據在構造(即使用userContext.CurrentUser = GetUserContext(message))后提供給對象圖。
- 1 回答
- 0 關注
- 83 瀏覽
添加回答
舉報