0

我正在构建一个三层应用程序,例如 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 是紧密相关的。

4

1 回答 1

0

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

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

就这样。它工作正常。

于 2013-05-01T08:58:40.397 回答