继承业务逻辑的最佳实践

时间:2013-04-23 20:43:35

标签: transactions three-tier

我正在构建一个三层应用程序,例如DAL,BLL,UI层。 DAL公开EF包装器(UnitOfWork和Generic Repository模式)。

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

您可以像一种ObjectContext Wrapper一样查看BLL组件: 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?我应该从我的基类构建一个inhertied对象,我不知道任何ctor参数。

2)如何确保BusinessTransactionBase和BusinessObjectBase类之间的IUnitOfWork共享?我强制要这样做,因为我怎么能说,BusinessObjectBase和BusinessTransactionBase紧密相关。

1 个答案:

答案 0 :(得分:0)

我认为已经解决了。 我创建了一个带有标准逻辑的密封业务类,例如我的公司要求我。它只是一个带有一些逻辑的IRepository包装器。 然后,我创建了一个可继承的业务事务类,它是一个简单的UnotOfWork模式。

该类使用事件参数公开受保护事件,该事件参数需要从某些UI或类似事件加载哪个businessObject,因此从业务事务类继承可以利用此事件来注入自己的“业务规则”。 BusinessRule是一个简单的接口,其中包含有关“GetDataRequired”和“SavingDataRequired”的方法,每次执行CRUD操作时,我都会在我的基础BusinessObject类中调用它。

这就是全部。 它工作正常。