域对象和服务类对象应该放在哪里?

时间:2011-06-08 09:04:25

标签: c# .net domain-driven-design

我正在尽力学习DDD,但我不确定一些非常基本的概念;您的域对象和服务位于何处,整体布局如何组织?我有一个习惯,无论好坏,我不知道,这就是我要问的原因;创建一个“程序”类,它包含域集合,域对象和服务对象。比如下面的例子。

这是好的还是坏的方法?如果不好,还有什么替代方案?我到目前为止只是在与winforms项目合作,所以这是我此时的主要关注点。

另外,如果您可以在此处对我使用“静态”对象进行一些评估吗?我经常不确定是否使用静态,并且如果我知道它是单个对象(如果这是正确的术语),则倾向于将其抛弃。

修改 的 为了解释一下,我正在使用“Program”类的New方法来协调不同的域对象,并在程序启动时从数据库等运行初始加载。所以,如果你建议我摆脱这个课程,那么我应该介绍一些其他服务来代替程序启动吗?

示例:

class Form1
{
    private MainClass main;
}

class MainClass
{
    public static UserService UserServ;
    public static UserAccountService UserAccServ;
    public static List<UserAccount> UserAccounts; 
}

class UserService
{
}

class UserAccountService
{
}

class UserAccount
{
    public UserData User;
}

class UserData
{
}

修改 回应大卫:

谢谢!为了解决你的观点:

1)我的例子只是一个粗略的类型,我为每个类使用单独的文件,而我的项目实际上已经有10,000行代码,尽管它可能听起来不像。

2)理解接口的提示。

3)了解汇编。

4)我正在使用Repositories(和FluentNHibernate),我打算让服务依赖于它们。目前我有xxxManager类,我知道这是坏的,并且会将它们更改为xxxServices。

5)我知道DI非常受欢迎,你说这一点很好,所以我知道这是我的问题的关键决心。我会学习的。据我所知,您建议我将服务直接注入表单类?但是域对象怎么样?他们住在哪里”?他们都应该住在某种类型的服务中吗?如果是这种情况,您创建什么类型的服务来处理程序启动逻辑?我理解使用存储库等持久化数据的服务的基本概念,但是我可能还没有其他类型的常见服务类与我的问题相关吗?

PS:我不应该(错误地)将我的课命名为“程序”,因为这已经是C#项目中的一个类。我同时使用C#和VB,所以实际上在C#中我通常称它为MainClass。所以我编辑了这个。

2 个答案:

答案 0 :(得分:1)

您所描述的是如何整理 依赖关系 (在这种情况下,您的表单项目取决于服务)。

关于上述代码的几点:

  • 看起来你的所有课程都在同一个文件中。通常,您应该将每个新类放在自己的文件中。
  • 您的服务类应该实现 interfaceIUserServiceIUserAccountService) - 这使您可以模拟单元测试的依赖关系,交换实现并且更好地解耦你的申请。
  • 理想情况下,您的服务类应该位于不同的程序集(新的visual studio项目)中,您的域实体(UserAccountUserData)也应如此。
  • 您可以考虑创建一个或多个存储库来处理简单地将数据提供给应用程序服务(应用程序服务将依赖于存储库,存储库依赖于服务)。
  • 您在静态字段中拥有服务(不是单例,这是一种在C#中使用静态字段的模式,以确保在应用程序的生命周期中只创建一个对象)。最好使用DI(见下文)而不是使用Program.UserService等表格。

一旦完成,那么您就可以使用依赖注入(DI)来为您的应用程序提供服务(而不是您的应用程序负责自己创建它们) )。 Ninject是一个不错的选择。这是an example of how to implement it,但您可能会在Ninject wiki上获得更多好运。

答案 1 :(得分:0)

对于领域驱动的设计,通常有一个包含三个项目的解决方案。应用程序,域和基础结构。

“应用程序”层包含Windows Forms应用程序以及与用户界面相关的内容,其中包含Program.cs文件。

“域”层包含根聚合,附加到根聚合的相关域实体以及域事件。还包含用于存储库的接口。

Infrastructure层包含NHibernate和您的存储库。