c# - 我怎样才能完全分离我的业务层和数据层?

标签 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);
}

我不希望我的业务类必须处理数据集,就像我不希望我的数据层类处理业务类一样。

我已经阅读了很多关于数据访问对象或数据传输对象的文章,可能会解决这个问题,但这似乎是这些模式的反模式案例。

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

最佳答案

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

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

关于该主题的开创性文本是 Martin Fowler 的文章 Inversion of Control Containers and the Dependency Injection pattern ,但从那时起我们已经取得了长足的进步,因此请务必也检查一些更新的文本。

您可以手动实现 DI,例如 described in this blog post ,或者您可以让 DI 容器(即框架)为您完成工作。

常见的 DI 容器有:

关于c# - 我怎样才能完全分离我的业务层和数据层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1066485/

相关文章:

c# - 评论我的简单 MVP Winforms 应用程序

c# - 加载属性延迟加载

c# - 元素属性语法和属性属性语法在语义上有区别吗?

c# - Unity JsonUtility无法访问嵌套变量

ios - 如何在swift中实现监听器模式

java - 根据 "foreign"子类型采取具体行动,无开关、转换等。我们能以某种方式使用多态性吗?

c# - 如果字符串是在 C# 中插入的,如何检查接受字符串的方法内部?

c# - 为什么匿名类型没有索引器属性?

c# - 如何在 PropertyGrid 中显示带有子类的对象

.net - .NET 中使用的适配器模式在哪里?