我正在构建一个三层应用程序,例如 DAL、BLL、UI 层。DAL 公开一个 EF 包装器(UnitOfWork 和通用存储库模式)。
BLL 组件是具有一些基本业务逻辑规则的 DAL 包装器。本质上,BLL 公开了一个带有虚拟 CRUD 和验证方法的 BusinessObjectBase 类(T 是 POCO 类),然后是一个 BusinessTransactionBase 来协调一个以上的 CRUD 操作。
您可以将 BLL 组件视为一种 ObjectContext Wrapper:BusinessObject = ObjectSet,每个实体都有业务逻辑。BusinessTransaction = ObjectContext 以及其他一些最小逻辑
此外,我的组件的主要目标是为不同的项目提供一组基本逻辑。今天我可以使用我的程序集来构建一个关于 MusicStore 的应用程序,明天我可以构建一个关于文档管理的应用程序,但我总是想使用我的基础组件 (BLL)
简单的片段:
public class BusinessObjectBase<T> where T : class
{
// protected IUnitOfWork ?
public virtual void Insert(T item)
{
// my default company logic rule..
if(this.Validate(item))
{
IUnitOfWork.GetRepository<T>().AddEntity<T>();
IUnitOfWork.Save();
}
}
public virtual void Edit(T item)
{
// my default company logic rule..
}
public virtual bool Validate(T item)
{
// my default company logic rule..
return true;
}
}
public class BusinessTransactionBase
{
// protected IUnitOfWork ?
public void BeingTransaction()
{
// ... Notify at all BusinessObjectBase to skip IUniOfWork.Save call
}
public void Commit()
{
this.IUnitOfWork.Save();
}
public BusinessObjectBase<T> GetBusinessObject<T>() where T : class
{
// How can I create an instance via reflection of an inherited class
// without to know ctor parameters?
}
}
好吧,我有两个问题:
1) 如何确保在 GetBusinessObject 方法上正确构建 BusinessObjectBase?我应该从我的基类中构建一个继承对象,并且我不知道任何 ctor 参数。
2) 如何确保 IUnitOfWork 在 BusinessTransactionBase 和 BusinessObjectBase 类之间共享?我必须这样做,因为我已经说过,BusinessObjectBase 和 BusinessTransactionBase 是紧密相关的。