簡體   English   中英

模型上的.NET MVC依賴注入?

[英].NET MVC Dependency Injection on Models?

問題:有沒有辦法使用Ninject將依賴項注入我的MVC模型?

首先,我是MVC和DI(以及stackoverflow,btw)的新手,所以我想確保我在這個問題上走下正軌。 幾天來我一直在谷歌搜索答案,但我找不到一個干凈的解釋......我正在使用C#,. NET4,MVC3,Ninject和VS2010。

這是一個場景:我有一個新的用戶表單,用戶可以在其中設置登錄,角色和設置其他配置文件數據。 提交時,我需要將登錄信息保存到MembershipProvider,RoleProvider的角色等等......它有點毛茸茸,因為我根據項目要求使用雙提供程序(Active Directory /本地數據庫),因此,在確定要保存到哪個提供程序時,如果用戶已經存在,是否允許自我識別任何角色,還有一些邏輯,等等。

我覺得這個邏輯應該放在我的模型上的.Save()方法中。 但是,我需要將我的提供者的實例注入到我的模型中,而Ninject似乎沒有注入模型 (至少不使用NuGet包附帶的默認設置)。 因此,我的初步問題。

我可以想到一些替代方案......

  1. 也許模型對於這個邏輯來說是一個不好的地方,我應該將邏輯抽象為服務? 但是為這個保存功能提供服務對我來說似乎有些過分。
  2. 我可以在我的控制器中吃掉臃腫......但我被告知“胖”控制器是一種不好的做法。
  3. 我想我可以將我的提供程序注入我的控制器,然后將這些依賴項傳遞給我的模型,但這看起來有點不穩定。

那么...... 有沒有辦法讓Ninject模型或者我需要重新考慮因為我是新手嗎?

我會選擇一個。 它並不過分 - 添加一個類和一個接口只需幾行代碼,它可以保持您的實現整潔,也許以后您可能想要添加更多方法...更新用戶?

添加一個接口和類來處理控制器使用的--ninject將為您獲取此實例。 我以IMembershipAndRoleService為例進行了編寫。

public interface IMembershipAndRoleService
{
    void ProcessNewUser(User newUser);
}

public class YourController : Controller
{
    private readonly IMembershipAndRoleService _membershipAndRoleService;

    public YourController(IMembershipAndRoleService membershipAndRoleService)
    {
        _membershipAndRoleService = membershipAndRoleService;
    }

    [HttpPost]
    public ActionResult NewUserFormAction(NewUserForm newUserForm)
    {
        //process posted form, possibly map / convert it to User then call to save
        _membershipAndRoleService.ProcessNewUser(user);
        //redirect or return view
    }
}

最后創建實現IMembershipAndRoleService的類,此類將使用您的Membership和Role提供程序或其他接口,這樣可以簡化此類中的邏輯。

如果您正在使用NuGet的Ninject.MVC包,它將掛鈎到MVC DependencyResolver,因此您可以執行此操作以獲取Ninject注入的模型實例。

var model = System.Web.Mvc.DependencyResolver.Current.GetService<MyModel>();

服務架構可能是設計應用程序的更好方法,但對於“我的模型為什么不注入”的簡單問題,這是因為您需要通過依賴注入容器創建它,而不是通過new()。

暫無
暫無

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

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