[英]ASP.NET Module Dependency Injection
在為我們的某些產品設計新的通用身份驗證框架時,我遇到了一個架構問題,我似乎找不到合適的解決方案。
我試圖簡化問題以便於解釋。
該庫有兩個類:
經理負責存儲當前已驗證的用戶。
模塊模塊負責根據安全策略驗證每個請求。 模塊必須要求管理員確定用戶當前是否已通過身份驗證。
現在,為管理器提供了接口的實現,該接口允許管理器從存儲庫加載用戶。 該庫中不包含特定的實現。 因此,我無法直接實例化庫中的存儲庫實例。
我無法修改屬性或為模塊構造函數提供參數。 所以我的問題是,如何給模塊提供對Manager實例的引用?
namespace Demo
{
public interface IRepository
{
object GetUser(int id);
}
public class Manager
{
public IRepository Repository { get; private set; }
public Manager(IRepository repository)
{
this.Repository = repository;
}
}
public class Module : IHttpModule
{
// How can i access an instance of the manager class here
// when I am unable to instantiate an instance of
// of an implementation of the IRepository interface.
}
}
在經典的ASP.NET中,我更喜歡在HttpApplication
( Global
)上實現一個接口,該接口聲明必要的依賴關系。 這里是IHasManager
(該應用程序是由lolcats編寫的):
public class Module: IHttpModule {
Manager manager;
public void Init(HttpApplication context) {
IHasManager application = context as IHasManager;
if (application != null) {
manager = application.Manager;
}
}
}
一種最簡單(如果很難看)的方法是在創建實例后將Manager實例填充到應用程序字典中:
HttpContext.Current.Application["Demo.Manager"] = new Manager(new Repository());
現在,您可以通過以下方式在模塊中訪問它:
var manager = HttpContext.Current.Application["Demo.Manager"] as Manager;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.