2013-04-23 61 views
0

我构建了三层应用程序,例如DAL,BLL,UI图层。 DAL公开一个EF包装(UnitOfWork和Generic Repository模式)。继承业务逻辑的最佳实践

BLL组件是一个包含一些基本业务逻辑规则的DAL包装器。 本质上,BLL使用虚拟CRUD和验证方法公开BusinessObjectBase类(T是POCO类),然后使用BusinessTransactionBase来协调多个CRUD操作。

您可以看看BLL组件,就像一种ObjectContext包装器: 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)如何确保BusinessTransactionBase和BusinessObjectBase类之间的IUnitOfWork共享?我强制要这么做,因为我怎么能说,BusinessObjectBase和BusinessTransactionBase紧密相关。

+0

有没有人可以帮助我? – bit 2013-04-24 09:08:35

回答

0

我觉得已经解决了。 我已经创建了一个封闭的商业课程,并使用标准逻辑,例如我的公司要求我。这只是一个包含逻辑的IRepository包装器。 然后,我创建了一个可继承的业务事务类,它是一个简单的UnotOfWork模式。

该类使用事件参数暴露了一个受保护的事件,该事件参数需要从某个用户界面或类似应用程序加载哪个businessObject,因此,来自业务事务类的继承可以利用此事件来注入自己的“业务规则” 。 BusinessRule是一个简单的接口,用于在每次执行CRUD操作时在基础BusinessObject类中调用“GetDataRequired”和“SavingDataRequired”方法。

就是这样。 它工作正常。