我目前在我的应用程序的单个项目中代表我的业务层和数据层。我在两组类之间有很好的关注点分离。但是,我的数据层类将作为参数并返回我的业务对象。所以我会有大致类似的代码(请不要对这段代码太挑剔,我的生产代码看起来不太像这样):
//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/