簡體   English   中英

Ninject在MVC 5控制器中

[英]Ninject in MVC 5 Controller

如果要使用Ninject在HomeController中創建服務,可以執行以下操作:

    IUserService _userService;

    public HomeController(IUserService userService)
    {
        _userService = userService;
    }

    public ActionResult SomeMethod()
    {
        userService.DoSomething();
       return View();
    }

    public ActionResult SomeOtherMethod()
    {
        //I don't use the service here
       return View();
    }

但是,說我只需要在我的控制器方法(SomeMethod)中僅使用該服務-上面的構造函數將為控制器中的所有方法(甚至SomeOtherMethod)觸發。 看起來很浪費?

如果將其更改為以下內容,它將一直工作到返回視圖為止,然后會出現錯誤(如使用Ninject將通用接口綁定到存儲庫時獲取“ MissingMethodException:無法創建接口的實例”中詳細介紹的):

    public HomeController()
    {
    }

    public ActionResult SomeMethod(IUserService userService)
    {
        userService.DoSomething();
       return View();
    }

只是沒有將ninject放入構造函數的開銷-這樣就可以了嗎? 還是我需要其他ninject種注射方法之一?

謝謝。

我會辯稱,如果您不需要其他方法的依賴關系,那么您的類將承擔過多的責任,您可能應該重新設計它,以使這些方法位於不同的類中。

MVC中的良好設計遵循“單一責任原則”,即對象應承擔的責任非常有限。 因此,如果您的班級需要用戶服務,但某些功能不需要它,那么這些功能將要做什么呢?

無論如何,當使用依賴注入時,您的依賴關系應該很便宜。 他們不應在其構造函數中進行任何實際工作,而僅在使用時進行初始化。 這樣,即使您有不用於特定方法的依賴項,開銷也不會很高。

話雖如此,您可以在運行時進行多種優化。 例如,您可以配置Ninject在各種條件下不實例化某些依賴關系,因此可以說,當當前操作為Foo時,即使它具有依賴關系,也不要創建用戶服務。

如果你真的要遲到創建IUserService您可以添加Ninject.Extensions.Factory然后構造注入Func<IUserServiceLazy<IUserService>或者甚至是一些接口廠IUserServiceFactory (這是使用綁定Bind<IUserServiceFactory>().ToFactory() )到構造函數中,並在SomeMethod Action中使用它。 例如:

Func<IUserService> _userServiceFactory;

public HomeController(Func<IUserService> userServiceFactory)
{
    _userServiceFactory= userServiceFactory;
}

public ActionResult SomeMethod()
{
    IUserService userService = _userServiceFactory();
    userService.DoSomething();
   return View();
}

public ActionResult SomeOtherMethod()
{
    //I don't use the service here
   return View();
}

但是,您應該考慮創建一個適當的“ 合成根”以盡快實例化整個對象圖是一種好的做法。 默認情況下,您還應該僅在有充分理由的情況下針對性能進行優化(這意味着您已經測量出該操作確實有助於提高性能)。 但是通常,這不僅僅是設計問題,而不僅僅是性能問題:您的控制器是否真的遵循SOLID (尤其是SRP )?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM