如何在业务实体上封装业务逻辑?
How to encapsulate business logic on business entities?
在 3 层应用程序中,我使用我的业务实体在我的 dbContext
上生成 dbSets
。
业务层:
public class User
{
string name {get;set;}
}
在数据层上:
public context:DbContext
{
public DbSet<User> Users {get;set;}
}
那么我的问题是如何在实体上封装逻辑?我可以使用扩展方法,但我也想要一些属性,我不希望它们泄漏到域层之外。
对于这种类型的架构,最好创建包含所有业务逻辑的交互器。这样你的领域模型(比如用户)可以非常轻量级。
创建交互器有两种常见的方法。一种方法是创建一个服务对象。该服务可以提供所有用例并执行所有业务逻辑。这种方法更适合简单的域模型和 small/medium 应用程序。
服务交互器示例:
public class UserService
{
public void ChangeUsername(User user, string name)
{
... business logic ...
}
}
另一种封装业务逻辑的常用方法是为每个用例创建一个对象。每当您添加新操作时,只需创建一个新的 class。这需要更多的初始工作和更好地掌握企业架构,但会产生非常可扩展的解决方案。
用例交互器示例:
public class ChangeUsernameOperation
{
public void ChangeUsernameOperation(User user, string name)
{
... business logic ...
}
}
在 3 层应用程序中,我使用我的业务实体在我的 dbContext
上生成 dbSets
。
业务层:
public class User
{
string name {get;set;}
}
在数据层上:
public context:DbContext
{
public DbSet<User> Users {get;set;}
}
那么我的问题是如何在实体上封装逻辑?我可以使用扩展方法,但我也想要一些属性,我不希望它们泄漏到域层之外。
对于这种类型的架构,最好创建包含所有业务逻辑的交互器。这样你的领域模型(比如用户)可以非常轻量级。
创建交互器有两种常见的方法。一种方法是创建一个服务对象。该服务可以提供所有用例并执行所有业务逻辑。这种方法更适合简单的域模型和 small/medium 应用程序。
服务交互器示例:
public class UserService
{
public void ChangeUsername(User user, string name)
{
... business logic ...
}
}
另一种封装业务逻辑的常用方法是为每个用例创建一个对象。每当您添加新操作时,只需创建一个新的 class。这需要更多的初始工作和更好地掌握企业架构,但会产生非常可扩展的解决方案。
用例交互器示例:
public class ChangeUsernameOperation
{
public void ChangeUsernameOperation(User user, string name)
{
... business logic ...
}
}