亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

屬性中的依賴注入

屬性中的依賴注入

C#
江戶川亂折騰 2019-11-20 09:43:05
我正在嘗試將依賴項注入到自定義中AuthorizeAttribute,如下所示:public class UserCanAccessArea : AuthorizeAttribute{    readonly IPermissionService permissionService;    public UserCanAccessArea() :        this(DependencyResolver.Current.GetService<IPermissionService>()) { }    public UserCanAccessArea(IPermissionService permissionService)    {        this.permissionService = permissionService;    }    protected override bool AuthorizeCore(HttpContextBase httpContext)    {        string AreaID =            httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;        bool isAuthorized = false;        if (base.AuthorizeCore(httpContext))            isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);        return isAuthorized;    }}這是可行的,但似乎可以作為一個單例解決,這意味著我得到了我以前的問題中描述的問題我想做的是使用屬性注入,但是由于我的屬性本身無法被Unity解析,因此我無法找到一種方法來配置容器以攔截和解析屬性。我嘗試了以下方法:public class UserCanAccessArea : AuthorizeAttribute{    public IPermissionService permissionService { get; set; }    protected override bool AuthorizeCore(HttpContextBase httpContext)    {        string AreaID =            httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;        bool isAuthorized = false;        if (base.AuthorizeCore(httpContext))            isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);        return isAuthorized;    }}容器:container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));但是該屬性在運行時始終為null。有沒有人做到這一點,如果有,您有榜樣嗎?
查看完整描述

3 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

您應該完全避免將依賴項注入到屬性中。本文中對此原因進行了解釋:屬性中的依賴注入:請勿這樣做!??偠灾疚慕忉屨f:

  • 構造函數的注入是不可能的,因為Attribute實例的創建不能被攔截。CLR處于控制之中。

  • 屬性注入的使用很脆弱,因為它會導致時間耦合,應該避免。

  • 將依賴項注入屬性使得無法驗證容器配置的正確性。

  • 像MVC和Web API這樣的框架緩存了屬性,這使得很容易意外地創建引起錯誤的俘獲依賴性。

您有兩種選擇:

  1. 通過將數據(屬性)從其行為(服務)中分離出來,使屬性變為被動狀態,如參考文章和Mark Seemann的相關文章中所述。

  2. 如本答案所述,將您的屬性轉換為不起眼的對象。這意味著您:

    1. 從屬性提取所有邏輯到包含所有依賴項的自定義服務中。

    2. 在您的容器中注冊該服務。

    3. 讓屬性的方法(AuthorizeCore根據您的情況)只需要從服務定位器/ DependencyResolver解析服務并調用服務的方法即可。這里要注意的重要一點是,您不能進行構造函數注入,屬性注入,并且服務不能以屬性私有狀態存儲(如您已經注意到的)。

使用哪個選項:

  • 如果您非常希望保持設計整潔,或者您需要使用這種方式應用多個屬性,或者要應用的屬性是在不依賴于System.Web的程序集中定義的,請使用選項1。 .Mvc。

  • 否則,請使用選項2。


查看完整回答
反對 回復 2019-11-20
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我一直在研究option1,如果您為要解析的dbcontext指定了InRequestScope(Ninject),則似乎無法使用它。否則,效果很好。我首先使用服務定位器(反模式)進行了嘗試,但解決了服務對象的創建問題。定制授權屬性的問題在于,它是在運行時創建的,并不遵循InRequestScope。如果我錯了,請糾正我。

查看完整回答
反對 回復 2019-11-20
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

請再次仔細閱讀選項1中提到的文章。在這種情況下,DbContext的生活方式是無關緊要的。屬性可以是單例,沒有任何問題,因為您無需向屬性中注入任何東西。該屬性只是數據。但是(一如既往),您必須確保操作篩選器服務的生存期短于或等于其依賴項,因為您將獲得專屬的依賴項。

查看完整回答
反對 回復 2019-11-20
  • 3 回答
  • 0 關注
  • 526 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號