如何完全分离业务和数据层?

Mat*_*nes 5 c# design-patterns

我目前在我的应用程序中的单个项目中代表我的业务层和数据层.我对两组课程之间的关注点有很好的分离.但是,我的数据层类作为参数并返回我的业务对象.因此,我将拥有松散类似的代码(请不要过于批评此代码,我的生产代码看起来不像这样):

//business class fragment
public bool Save()
{
    if(this.IsValid)
    {
       //DataProvider is one of many data access classes that implement an IDataProvider interface.  Switched elsewhere in the class.  This allows switching of Database providers, xml, etc.
       DataProvider.Save(this);
       return true;
    }
    return false;
}

public List<MyBusinessObject> GetObjectsByCriteria(string criteria)
{
    return DataProvider.GetMyBusinessObjectsByCriteria(criteria);
}
Run Code Online (Sandbox Code Playgroud)

我不希望我的业务类必须处理DataSet,而不是让我的数据层类处理Business Classes.

我已经在数据访问对象或数据传输对象上阅读了很多内容以解决这个问题,但这似乎是这些模式的反模式案例.

我能做什么?如何优雅地完成我的应用程序这两层的完全分离?

Mar*_*ann 3

这是一个比如何将领域模型与数据访问分离更普遍的问题。当您尝试将应用程序逻辑与域模型、表示模型与应用程序逻辑等分离时,也会出现同样的问题。

常见的解决方案是一种称为依赖注入 (DI) 的技术。有些人也将其称为控制反转(IoC)。

关于这个主题的开创性文本是 Martin Fowler 的文章控制容器反转和依赖注入模式,但从那时起我们已经取得了很大的进步,所以一定要检查一些更新的文本。

您可以手动实现 DI,如本博客文章中所述,也可以让 DI 容器(即框架)为您完成工作。

常见的 DI 容器有: