我相信以前有人问过这个问题,但我正在努力寻找。
我正在使用Ninject从我的控制器中删除依赖项,以及存储库设计模式。
在我看来,这种方法的好处之一是,我可以轻松地将我的存储库和领域实体分开,并在我愿意的情况下使用另一个程序集。因此,我将域实体和存储库保存在外部程序集中,并且可以从接口模拟所有依赖项。
看起来,虽然我可以在大多数地方使用接口来引用我的领域实体,但当涉及到模型绑定时,我必须使用对具体类的引用。我已经读到,这是与序列化,我理解,但唯一的方法来避免引用领域实体创建单独的模型?
我可以用自定义模型绑定做什么?
背景介绍:我是一名经验丰富的ASP.net开发人员,但刚接触MVC。
视图模型应该是没有逻辑的纯数据容器,因此不应该有任何依赖关系。相反,将存储库注入到控制器中,并让控制器将存储库中所需的数据分配给视图模型的适当属性。
使用依赖注入框架的主要优点是IoC(控制反转):
- 松散耦合
- <
- 更多的灵活性/gh><
- 容易em>测试
public class MyController : Controller
{
private IPersonRepository personRepo;
public MyController(IPersonRepository personRepo)
{
this.personRepo = personRepo;
}
...
}
在测试期间,这允许轻松注入我的模拟存储库,它返回我想要测试的那些值。
注入域实体没有多大意义,因为它们与特定类/控制器中的功能更紧密地联系在一起,因此进一步抽象它们只会增加开销而不是带来好处。相反,如果你想将实际的实体模型与控制器解耦,你可以看看MVVM模式,创建专门的"ViewModels"。
只要考虑控制器的可测试性:"我想模拟什么来单元测试它?"
- 数据库访问->存储库
- 外部依赖项->其他BL类,WS调用等
我不会在这里包括域实体,因为它们通常只是一个数据容器。
更多细节会有所帮助。也许是一段代码?
首先,您应该避免将依赖项注入域实体,而是使用域服务。
更多信息在这里。
编辑001:我想我们应该澄清一下术语。领域层包含所有领域实体,例如产品、类别等。然后是数据层,你的存储库为你的领域实体提供水合物,然后你有一个服务层,你的应用程序服务与数据层通信。
最后,你有一个包含视图和控制器的表示层。控制器与你的应用服务层对话。因此,产品控制器与目录服务(例如getproductysku)进行通信。目录服务将有一个或多个存储库注入到它的构造函数中(iproductrerepository、ICategoryRepository等)。在asp.net mvc中,ViewModels也很常见。把ViewModels放到你的应用服务层
所以我不确定你说的"模型"one_answers"领域实体"是什么意思,但我希望这能澄清术语。