gpt4 book ai didi

c# - 分离业务逻辑

转载 作者:行者123 更新时间:2023-11-30 20:11:03 26 4
gpt4 key购买 nike

我有一个定义了属性和方法的客户类。目前它包含与客户相关的任何类型任务的方法。例如,它包含一个方法“InsertOrUpdateCustomer”。此方法要么将新客户记录插入数据库,要么便于编辑现有客户记录。

这个类还包含一些客户字段的验证方法。

我认为这不是更好的方法。我想像这样打破它:

interface ICustomer
{
string CustomerName;
date FinancialYearStartDate;
date FinancialYearEndDate;
string TaxNo;
string Address;
}

我想将此接口(interface)实现到另一个类,例如 Customers:

class Customers: ICustomer
{
// Properties
CustomerName { get; set; }
FinancialYearStartDate { get; set; }
FinancialYearEndDate { get; set; }
TaxNo { get; set; }
Address { get; set; }

// Constructor
}

我想知道:

  1. 在哪里添加插入或更新新客户的方法?我应该创建另一个类还是在上面的类中添加方法?

  2. 用上面给定的方式打破我原来的单一类是否有益?接口(interface)在上面的代码中有什么好处?

  3. 我想删除验证方法并改用验证框架。我是否需要创建一个不同的类“CustomerValidations”来进行验证,或者我应该使用上面的类本身?

最佳答案

  1. 对于插入和更新方法,我会创建一个 repository , 使用 CRUD 方法(例如 ICustomerRepository)
  2. 我看不到 ICustomer 接口(interface)的直接好处
  3. 我会使用在业务实体外部进行验证的方法;例如在专用验证类中,或在类似 spring.net validation 的配置文件中.

总的来说,我认为有一个 single responsibility 是个好主意每类 - 例如业务状态 Customer,持久存储 NHibernateCustomerRepository : ICustomerRepository 和验证 CustomerValidator

存储库示例:

interface ICustomerRepository
{
// Get by id
Customer Get(int id);
void Delete(Customer customer);
IList<Customer> GetAll();
// creates a new instance in datastore
// returns the persistent identifier
int Save(Customer customer);
// updates if customer exists,
// creates if not
// returns persistent identifier
int SaveOrUpdate(Customer customer);
// updates customer
void Update(Customer customer);

// specific queries
IList<Customer> GetAllWithinFiscalYear(DateTime year);
// ...
}

如您所见,此接口(interface)的第一个方法对于大多数业务实体而言都是相似的,并且可以抽象为:

interface IRepository<TId, TEntity>
{
// Get by id
TEntity Get(TId id);
void Delete(TEntity entity);
IList<TEntity> GetAll();
// creates a new instance in datastore
// returns the persistent identifier
TId Save(TEntity entity);
// updates if customer exists,
// creates if not
// returns persistent identiefier
TId SaveOrUpdate(TEntity entity);
// updates customer
void Update(TEntity entity);
}

interface ICustomerRepository : IRepository<int, Customer>
{
// specific queries
IList<Customer> GetAllWithinFiscalYear(DateTime year);
}

关于c# - 分离业务逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4283624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com