我发现我的构造函数开始是这样的:
public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2.... )
随着参数列表的不断增加。既然“容器”是我的依赖注入容器,为什么我不能这样做:
public MyClass(Container con)
每一节课?缺点是什么?如果我这样做,感觉就像我在使用美化的静电。请分享你对IoC和依赖注入疯狂的想法。
我发现我的构造函数开始是这样的:
public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2.... )
随着参数列表的不断增加。既然“容器”是我的依赖注入容器,为什么我不能这样做:
public MyClass(Container con)
每一节课?缺点是什么?如果我这样做,感觉就像我在使用美化的静电。请分享你对IoC和依赖注入疯狂的想法。
当前回答
传入参数的困难不是问题。问题是你的类做的太多了,应该再分解一些。
依赖注入可以作为类变得太大的早期警告,特别是因为传递所有依赖的痛苦正在增加。
其他回答
问题:
1)参数列表不断增加的构造函数。
2)如果类是继承的(例如:RepositoryBase),则更改构造函数 签名会导致派生类发生变化。
解决方案1
将IoC容器传递给构造函数
Why
不再有不断增加的参数列表 构造函数的签名变得简单
为什么不
使您的类与IoC容器紧密耦合。(当1.;你想在使用不同IoC容器的其他项目中使用该类。2. 你决定改变IoC容器) 使你的类不那么具有描述性。(你不能真正地看类构造函数,并说它需要什么功能。) 类可以潜在地访问所有服务。
解决方案2
创建一个将所有服务分组并将其传递给构造函数的类
public abstract class EFRepositoryBase
{
public class Dependency
{
public DbContext DbContext { get; }
public IAuditFactory AuditFactory { get; }
public Dependency(
DbContext dbContext,
IAuditFactory auditFactory)
{
DbContext = dbContext;
AuditFactory = auditFactory;
}
}
protected readonly DbContext DbContext;
protected readonly IJobariaAuditFactory auditFactory;
protected EFRepositoryBase(Dependency dependency)
{
DbContext = dependency.DbContext;
auditFactory= dependency.JobariaAuditFactory;
}
}
派生类
public class ApplicationEfRepository : EFRepositoryBase
{
public new class Dependency : EFRepositoryBase.Dependency
{
public IConcreteDependency ConcreteDependency { get; }
public Dependency(
DbContext dbContext,
IAuditFactory auditFactory,
IConcreteDependency concreteDependency)
{
DbContext = dbContext;
AuditFactory = auditFactory;
ConcreteDependency = concreteDependency;
}
}
IConcreteDependency _concreteDependency;
public ApplicationEfRepository(
Dependency dependency)
: base(dependency)
{
_concreteDependency = dependency.ConcreteDependency;
}
}
Why
向类添加新的依赖项不会影响派生类 类与IoC容器无关 类是描述性的(就其依赖关系而言)。按照惯例,如果您想知道A依赖于什么类,该信息将在A依赖项中积累 构造函数签名变得简单
为什么不
需要创建额外的类 服务注册变得复杂(需要分别注册每个X.Dependency) 概念上与传递IoC容器相同 . .
解决方案2只是一个原始的,如果有可靠的理由反对它,那么描述性的评论将会受到赞赏
一个方法的参数太多是一个暗示(不一定),你的方法太大/有太多的责任。
此外,在同一方法中使用的参数(可能)具有很高的内聚性——>值得考虑将它们放在一个类中——>只必须传递一个参数。
传入参数的困难不是问题。问题是你的类做的太多了,应该再分解一些。
依赖注入可以作为类变得太大的早期警告,特别是因为传递所有依赖的痛苦正在增加。
你在使用什么依赖注入框架?你尝试过使用基于setter的注入吗?
基于构造函数的注入的好处是,对于不使用依赖注入框架的Java程序员来说,它看起来很自然。你需要5个东西来初始化一个类,然后你的构造函数有5个参数。缺点正如你所注意到的,当你有很多依赖时,它会变得笨拙。
在Spring中,你可以使用setter来传递所需的值,并且可以使用@required注释来强制注入这些值。缺点是您需要将初始化代码从构造函数移动到另一个方法,并在所有依赖项注入后通过使用@PostConstruct进行标记让Spring调用该方法。我不确定其他框架,但我认为它们做了类似的事情。
两种方法都有效,这是一个偏好的问题。
我不认为你的类构造函数应该引用你的IOC容器期。这代表了类和容器之间不必要的依赖关系(IOC试图避免的依赖类型!)