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