所有情况下的IoC容器? (针对静态类)

时间:2016-08-05 12:03:03

标签: c# ioc-container static-classes

我是一名年轻的开发人员,我刚学习依赖注入,我有一个折磨我的问题。

在我的例子中,我有一个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:对不起我的英文

1 个答案:

答案 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;
    }
}