簡體   English   中英

模型的Unity依賴注入

[英]Unity dependency injection for Models

我剛剛開始將Unity與MVC結合使用,並且遇到了一些代碼重復的問題。 考慮以下控制器/模型模式:

控制器:

public class MyController : Controller {
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;
    private readonly IDependency3 _dependency3;

    public MyController(
        IDependency1 dependency1,
        IDependency2 dependency2,
        IDependency3 dependency3
    ) {

    }

    public ActionResult Thingy() {
        var model = new Thingy(_dependency1, _dependency2, _dependency3);
        model.DoLogic();
        model.SetUpView();
        model.Finalize();
        return View(model);
    }
}

模型:

public class Thingy {
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;
    private readonly IDependency3 _dependency3;

    public Thingy(
        IDependency1 dependency1,
        IDependency2 dependency2,
        IDependency3 dependency3
    ) {

    }

    // Now I can use my dependencies
}

這使我可以實現瘦控制器/胖模型,但是現在我在控制器和模型中都復制了依賴項。

我看到可以在模型中使用屬性:

public class Thingy {
    [Dependency]
    public IDependency1 Dependency1 { private get; set; };
    [Dependency]
    public IDependency2 Dependency2 { private get; set; };
    [Dependency]
    public IDependency3 Dependency3 { private get; set; };
}

然后像這樣初始化我的模型:

public ActionResult Thingy() {
    // No need to pass in via constructor
    var model = DependencyResolver.Current.GetService<Thingy>();
}

從編碼POV來看很不錯,但是我讀到這是反模式嗎?

問:為什么將其視為反模式,我可以修改結構以防止代碼重復嗎?

是的,這是反模式。 原因之一-過多的關聯性代碼。 如果要替換IoC容器(例如NInject),則必須更改控制器和模型的代碼。 它違反了開放/封閉原則( http://en.wikipedia.org/wiki/SOLID_(object-oriented_design) )。 另外,您將很難做單元測試控制器。

暫無
暫無

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

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