Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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#_.net_Domain Driven Design - Fatal编程技术网

C# 域对象和服务类对象应该位于何处?

C# 域对象和服务类对象应该位于何处?,c#,.net,domain-driven-design,C#,.net,Domain Driven Design,我正在尽最大努力学习DDD,但我不确定一些真正的基本概念;您的域对象和服务位于何处,总体布局是如何组织的?我有一个习惯,好或坏我不知道,这就是为什么我问;创建一个“Program”类,其中包含域集合、域对象和服务对象。就像下面的例子 这是个好方法还是坏方法?如果不好,还有什么替代方案?到目前为止,我只是在处理winforms项目,所以这是我目前最关心的问题 另外,如果您能在这里对我使用的“静态”对象进行一些评估?我经常不确定是否要使用static,如果我知道它是一个单例对象(如果这是正确的术语)

我正在尽最大努力学习DDD,但我不确定一些真正的基本概念;您的域对象和服务位于何处,总体布局是如何组织的?我有一个习惯,好或坏我不知道,这就是为什么我问;创建一个“Program”类,其中包含域集合、域对象和服务对象。就像下面的例子

这是个好方法还是坏方法?如果不好,还有什么替代方案?到目前为止,我只是在处理winforms项目,所以这是我目前最关心的问题

另外,如果您能在这里对我使用的“静态”对象进行一些评估?我经常不确定是否要使用static,如果我知道它是一个单例对象(如果这是正确的术语),我倾向于直接使用它

编辑: 为了进一步解释,我使用了“Program”类的新方法来协调不同的域对象,并在程序启动时从数据库等运行初始加载。所以,如果你建议我去掉这个类,那么我应该引入一些其他服务来处理程序启动吗

例如:

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
{
私有主类主类;
}
类主类
{
公共静态用户服务;
公共静态UserAccountService UserAccServ;
公共静态列表用户帐户;
}
类用户服务
{
}
类UserAccountService
{
}
类用户帐户
{
公共用户数据用户;
}
类用户数据
{
}

编辑: 对David的答复:

谢谢!针对您的观点:

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

2) 了解有关接口的提示

3) 了解汇编

4) 我正在使用存储库(和FluentNHibernate),我计划让服务依赖于它们。目前,我有xxxManager类,我知道这是不好的,并将努力将它们更改为xxxServices

5) 我知道DI很受欢迎,很高兴你能提出这一点,所以我知道这是解决我问题的关键。我会学习的。据我所知,您建议我将服务直接注入表单类?但是域对象呢?他们“住在哪里”?他们都应该生活在某种服务中吗?如果是这样,您会创建什么类型的服务来处理程序启动逻辑?我了解用于持久化数据、使用存储库等的服务的基本概念,但可能还有其他类型的公共服务类,我不知道,与我的问题有关


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

您描述的是如何组织依赖关系(在本例中,您的表单项目取决于服务)

关于上述代码的几点:

  • 看起来您的所有类都在同一个文件中。通常,您应该将每个新类放在它自己的文件中
  • 您的服务类应该实现
    接口
    IUserService
    IUserAccountService
    )-这使您能够模拟单元测试的依赖关系,交换实现,并更好地解耦应用程序
  • 理想情况下,您的服务类应该位于不同的程序集中(新的visual studio项目),域实体(
    UserAccount
    UserData
    )也应该位于不同的程序集中
  • <> LI>您可以考虑创建一个或多个存储库来处理简单地将数据获取到应用程序服务(应用程序服务将对存储库有依赖性,库将<强>不/强>依赖于服务)。
  • 您的服务在静态字段中(而不是单例,这是一种在C#中使用静态字段的模式,以确保在应用程序的生命周期中只创建一个对象)。您最好使用DI(见下文),而不是使用
    Program.UserService
    …等形式

完成后,您就可以考虑使用依赖注入(DI)
为应用程序提供服务(而不是应用程序自己负责创建服务)。将是一个很好的选择使用。这是一个很好的解决方案,但是你可能会在这方面有更多的运气。

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

应用程序层包含Windows窗体应用程序和与用户界面相关的内容,它包含
Program.cs
文件

域层包含根聚合、附加到根聚合的相关域实体和域事件。还包含存储库的接口


基础结构层包含NHibernate和您的存储库。

谢谢!我在上面的编辑中做出了回应。如果你还有什么要补充的话,那就太好了,因为我在这方面还是有点不知所措。