1 回答

TA貢獻1884條經(jīng)驗 獲得超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組件依賴于運行時數(shù)據(jù)的可用性,而正如此處所述,對象圖的創(chuàng)建應該與運行時數(shù)據(jù)分開,并且運行時數(shù)據(jù)應該流經(jīng)系統(tǒng)。
換句話說,您應該將您的UserContext課程重寫為以下內(nèi)容:
public class AspNetUserContext : IUserContext
{
User CurrentUser => (User)HttpContext.Current.Session[USER_CONTEXT];
}
這允許IUserContext按如下方式注冊此特定于 ASP.NET 的實現(xiàn):
container.RegisterInstance<IUserContext>(new AspNetUserContext());
當然,前面的并沒有解決你的Windows Service中的問題,但是前面的確實為解決這個問題打下了基礎(chǔ)。
對于 Windows 服務,您還需要自定義實現(xiàn)(適配器):
public class ServiceUserContext : IUserContext
{
User CurrentUser { get; set; }
}
這個實現(xiàn)要簡單得多,這里ServiceUserContext的CurrentUser屬性是一個可寫屬性。這優(yōu)雅地解決了您的問題,因為您現(xiàn)在可以執(zhí)行以下操作:
// 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);
.....
}
在這里,解決方案也是將對象圖的創(chuàng)建與運行時數(shù)據(jù)的使用分開。在這種情況下,運行時數(shù)據(jù)在構(gòu)造(即使用userContext.CurrentUser = GetUserContext(message))后提供給對象圖。
- 1 回答
- 0 關(guān)注
- 88 瀏覽
添加回答
舉報