Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模型的统一依赖注入_C#_Asp.net Mvc_Dependency Injection_Unity Container - Fatal编程技术网

C# 模型的统一依赖注入

C# 模型的统一依赖注入,c#,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net Mvc,Dependency Injection,Unity Container,我刚刚开始将Unity与MVC结合使用,我发现有点代码重复。考虑下面的控制器/模型模式: 控制器: public class MyController : Controller { private readonly IDependency1 _dependency1; private readonly IDependency2 _dependency2; private readonly IDependency3 _dependency3; public MyC

我刚刚开始将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 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>();
}
public ActionResult Thingy(){
//无需通过构造函数传入
var model=DependencyResolver.Current.GetService();
}
从编码的角度来看,这很好,但我读到这是一种反模式


Q:为什么这被视为反模式,我可以修改我的结构以防止代码重复?是的,这是反模式。原因之一——过度关联代码。如果要替换IoC容器(例如NInject),则必须更改控制器和模型的代码。它违反了打开/关闭原则()。此外,您将很难对控制器进行单元测试

你为什么想要一个胖模特?你真的认为你的模型应该知道视图吗?此模型是否可用于web/mobile/embedded(一般重复使用)?控制者不应该是做“思考”和安排事情的人吗。视图应该显示数据。模型就是数据?这里的反模式是您的模型包含依赖项。一个模型应该是一个普通的老DTO;只有数据,没有行为。您应该只将数据对象返回到视图中,因为视图无法(轻松地)进行测试,并且将逻辑移到模型中会增加复杂性。我明白了,这是有意义的-多亏了这两者-我将重构控制器:)