我确定之前有人问过这个,但我很难找到。
我正在使用Ninject从我的控制器中删除依赖项,以及存储库设计模式。
据我了解,这种方法的好处之一是我可以轻松地将我的存储库和域实体分开,并且如果我愿意,可以使用另一个程序集。因此,我将域实体和存储库保存在外部程序集中,并可以从接口模拟我的所有依赖项。
似乎虽然我可以在大多数地方使用接口来引用我的域实体,但在模型绑定方面我必须使用对具体类的引用。我已经读过这与我理解的序列化有关,但这是避免引用域实体创建单独模型的唯一方法吗?
我可以用自定义模型绑定做什么?
一些背景知识:我是一名经验丰富的ASP.net开发人员,但对MVC来说是新手。
答案 0 :(得分:8)
View Models应该是没有逻辑的普通数据容器,因此根本不应该有任何依赖。而是将存储库注入控制器,并将存储库中所需的数据分配给视图模型的相应属性。
答案 1 :(得分:4)
使用依赖注入框架的主要优点是 IoC (控制反转):
所以人们通常做的是通过其接口注入存储库,如
public class MyController : Controller
{
private IPersonRepository personRepo;
public MyController(IPersonRepository personRepo)
{
this.personRepo = personRepo;
}
...
}
在测试期间,这允许轻松注入我的模拟存储库,该存储库返回我想要测试的那些值。
注入域实体没有多大意义,因为它们与特定类/控制器中的功能更紧密地链接,因此进一步抽象它们只是一个开销而不是一个好处。相反,如果您想将实际实体模型与控制器分离,可以查看MVVM模式,创建专门的“ViewModels”。
考虑一下你的控制器的可测试性:“我想要模拟出单元测试它?”
我不会在此处包含域名实体,因为它们通常只是数据容器。
答案 2 :(得分:1)
更多细节会有所帮助。或许有点代码?
首先,您应该避免将依赖项注入域实体,而应使用域服务。
更多信息here。
编辑001:
我认为我们应该澄清我们的术语。 域层包含所有域实体,例如产品,类别等 然后是数据层与您的存储库一起保存您的域实体,然后您有一个服务层,其中包含与数据层对话的应用程序服务。
最后,您有一个包含视图和控制器的表示层。控制器与您交流Aplication Service Layer。因此,产品控制器与目录服务(例如GetProductBySku)进行通信。 CatalogueService将一个或多个存储库注入其构造函数(IProductRepository,ICategoryRepository等)。 在asp.net mvc中使用ViewModel也很常见。将ViewModel放在应用程序服务层中。
所以当你说“模特”和“领域实体”时,我不确定你的意思,但我希望这样清楚术语。