我使用CRC卡设计了我的类,我有一组可爱的对象,包含域/业务逻辑和数据(属性)。有些类需要保存到数据库并从中读取数据。
我的存储库应该存在于我的域对象的单独项目中,但需要引用它们才能创建它们。
但是,域对象/实体需要能够引用存储库。
我可以将对象放在存储库中,但由于它们包含域功能,所以根本感觉不对。
我可以将需要持久性的对象放在一个共同的共享项目中,但再次将它们单独输出会感觉不对。
我应该把它们放在哪里?我不能帮助我觉得我错过了一些明显的东西。
答案 0 :(得分:4)
域对象/实体不应使用存储库。其域/应用程序服务应使用存储库。这样做非常简单 - 您应该在域模型程序集中定义存储库接口,并在域/应用程序服务中使用它们。
域库应包含
此库不引用其他库 - 它位于系统的核心。
持久性库应包含特定于数据提供者的存储库的实现。例如。它可以使用实体框架。该库应该引用您的域库。因此,它将了解它应该实现的接口以及它应该使用的实体。
答案 1 :(得分:0)
但是,域对象/实体需要能够引用存储库。
他们呢?或者他们是否需要引用存储库的接口?然后,存储库本身只是该接口的一个实现,是域逻辑代码不需要的低级细节。
我通常在项目中构建存储库模式的方式是:
作为一个例子,假设我使用服务定位器进行依赖注入(我经常这样做)。然后,业务模型只需要引用Service Locator对象(它本身由工厂提供并可以注入)。因此,商业模式的内部可能有这样的东西:
public class SomeBusinessModel
{
private ISomeDependency SomeProperty
{
get
{
return DIFactory.Current.Resolve<ISomeDependency>();
}
}
}
DIFactory
有一个名为Current
的静态属性,它基本上是一个返回依赖注入解析器的工厂方法,它的接口有一个名为Resolve
的方法,它接受一个类型并返回一个实例
所以在这种情况下......
SomeBusinessModel
位于域核心项目中ISomeDependency
位于域核心项目中IDIContainer
(Current
的返回类型)位于域核心项目DIFactory
位于域核心项目中,并由Application Project为特定的依赖注入容器初始化(它具有设置当前注入容器的Initialize
方法)SomeDependency
(解析程序返回的实际实例类型)在依赖项目中在此设置中,业务模型知道需要存储库,并且需要提供存储库,但它们不具有硬依赖性。应用程序为这些存储库提供实际实现,可以直接通过提供实例,也可以通过配置依赖注入容器间接提供实例。
所有实际依赖项都将向内从实现细节(应用程序和依赖项)指向核心业务逻辑。永远不要向外。