我是一名年轻的开发人员,我刚学习依赖注入,我有一个折磨我的问题。
在我的例子中,我有一个WCF服务网站(soap),它执行一些简单的业务操作并调用数据库。
所以,我的项目被切入
服务 - >业务层 - >层数据访问 - >数据库
就我而言,业务层中有简单的业务操作,数据访问层中有SELECT SELECT。
所以现在(当然是错误的方式)我使用静态类在我的层之间进行通信:
总结:
服务层:
public void GetData()
{
BusinessLayer.GetData();
}
业务层:
static class BusinessLayer
{
public static void GetData()
{
//If something or something else ...
DataAccessLayer.GetData();
}
}
数据访问层:
static class DataAccessLayer
{
public static void GetData()
{
//DO insert in database
}
}
首先,这是一个不好的方式吗?
那么,对于这种非常简单的情况,是否值得设置IoC容器?
提前谢谢。
PS:对不起我的英文
答案 0 :(得分:0)
我会从你的图层类中创建接口。这将根据需要删除静态类,并设置为注入。对于你的例子,这是一个相当小的例子,除非作为学习经验,否则我不建议你去解决问题。什么时候使用这种注射没有硬性规则,但是当单元测试出现时,这种模式有很大帮助。
没有人说过:“哇!如果它是静态方法或单例,那么编写单元测试要容易得多!”
最后,您将获得要注入的功能的界面。这假设存在一定级别的域模型,并且数据库中的原始数据将转换为模型。
您首先要定义必须注入依赖类的各种接口。
public interface IBusinessLayer
{
Data GetData();
}
public interface IDataAccessLayer
{
Data GetData();
}
public interface IDatabase
{
DbData GetDatabaseData();
}
主要目标是让容器注入您完成所需操作的功能。在此,获取数据。假设您的数据是域模型中的一个类。
public class ServiceLayer
{
IBusinessLayer business = null;
public ServiceLayer(IBusinessLayer business)
{
this.business = business;
}
public void GetData()
{
Data data = business.GetData();
// do something with data
}
}
您可以为不同的图层重复相同的图案。虽然这对于一个简单的应用程序来说似乎有很多工作,但接口给出的硬边允许每个层自己进化......只要接口合同仍然存在。
如果你清楚地定义了各层,那么隔离是很好的。例如,通过不让原始数据库数据,行等渗入上层。
公共类BusinessLayer:IBusinessLayer { IDataAccessLayer dataAccess = null;
// container will inject data access layer
public BusinessLayer(IDataAccessLayer dataAccess)
{
this.dataAccess = dataAccess;
}
public Data GetData()
{
Data data = dataAccess.GetData();
// do something with data?
return data;
}
}
// Retruns typed data business layer
public class DataAccessLayer : IDataAccessLayer
{
IDatabase db = null;
public DataAccessLayer(IDatabase db)
{
this.db = db;
}
public Data GetData()
{
var db_data = db.GetDatabaseData();
Data data = /*convert raw db_data -> type domain data*/
return data;
}
}