Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在所有情况下都是IoC容器?(针对静态类)_C#_Ioc Container_Static Classes - Fatal编程技术网

C# 在所有情况下都是IoC容器?(针对静态类)

C# 在所有情况下都是IoC容器?(针对静态类),c#,ioc-container,static-classes,C#,Ioc Container,Static Classes,我是一个年轻的开发人员,刚开始学习依赖注入,我有一个问题困扰着我 在我的示例中,我有一个WCF服务web(soap),它执行一些简单的业务操作并调用数据库 所以,我的项目被分为 服务->业务层->层数据访问->数据库 在我的例子中,在业务层有简单的业务操作,在数据访问层有选择语句 所以现在(肯定是错误的方式)我使用静态类在我的层之间进行通信: 总之: 服务层: public void GetData() { BusinessLayer.GetData();

我是一个年轻的开发人员,刚开始学习依赖注入,我有一个问题困扰着我

在我的示例中,我有一个WCF服务web(soap),它执行一些简单的业务操作并调用数据库

所以,我的项目被分为

服务->业务层->层数据访问->数据库

在我的例子中,在业务层有简单的业务操作,在数据访问层有选择语句

所以现在(肯定是错误的方式)我使用静态类在我的层之间进行通信:

总之:

服务层:

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:对不起,我的英语不好

我会用你的图层类制作接口。这将根据需要删除静态类,并为您设置注入。对于你的例子,这是相当小的,我不建议通过麻烦,除非作为一个学习经验。对于何时使用这种注入没有严格的规则,但是当单元测试开始时,这种模式非常有帮助

没有人说过:“哇!如果是静态方法或单例,那么编写单元测试就容易多了!”

最后,您将拥有一些与您想要注入的功能的接口线类似的东西。这假定存在某种级别的域模型,并且数据库中的原始数据将转换为模型

首先定义必须注入依赖类的各种接口

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
    }
}
可以为不同的层重复相同的图案。虽然对于一个简单的应用程序来说,这似乎是一个很大的工作,但接口所提供的硬边允许每一层独立发展。。。只要接口合同仍然有效

如果你保持层次清晰,分离是很好的。例如,不让原始数据库数据、行等流入上层

公共类业务层: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;
    }
}

这个问题的前提似乎不成立。这不是静态类与IoC容器,因为你不需要IoC容器来进行依赖注入。这更取决于你的公司是如何做的,以及他们改变发展方向的速度有多快)有些情况下,IoC可用于非常简单的场景,还有c当IoC根本不是一个选项时,这个问题似乎相当广泛,因此可能会被关闭。你不应该关心容器,而应该关心你的类的实际设计。你通常提到的
static
“独立于类的实际实例而存在的东西。然而,我假设业务层与数据访问层的关系为1:1,不是吗?因此,makie thjis所有实例,您就完成了。描述了何时使用容器。