JP *_*son 288 c# java dependency-injection ioc-container inversion-of-control
我发现我的构造函数开始看起来像这样:
public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2.... )
Run Code Online (Sandbox Code Playgroud)
随着参数列表不断增加.由于"容器"是我的依赖注入容器,为什么我不能这样做:
public MyClass(Container con)
Run Code Online (Sandbox Code Playgroud)
每个班级?有什么缺点?如果我这样做,感觉我正在使用一个美化的静电.请分享您对IoC和依赖注入疯狂的看法.
Mar*_*ann 394
您是对的,如果您将容器用作服务定位器,它或多或少是一个美化的静态工厂.由于很多原因,我认为这是一种反模式.
构造函数注入的一个很好的好处是它违反了单一责任原则,这是非常明显的.
当发生这种情况时,是时候重构Facade Services了.简而言之,创建一个新的,更粗粒度的界面,隐藏您当前需要的部分或全部细粒度依赖关系之间的交互.
kyo*_*ryu 25
传递参数的难度不是问题.问题是你的班级做得太多了,应该分解得更多.
依赖注入可以作为类太大的早期警告,特别是因为传递所有依赖项的痛苦越来越大.
问题 :
1) 参数列表不断增加的构造函数。
2) 如果类是继承的(例如:)RepositoryBase,则更改构造函数签名会导致派生类发生更改。
解决方案1
传递IoC Container给构造函数
为什么
为什么不
解决方案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;
}
}
Run Code Online (Sandbox Code Playgroud)
派生类
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;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么
A依赖于哪个类,该信息会累积在A.Dependency为什么不
X.Dependency)IoC Container解决方案 2 只是一个原始方案,如果有确凿的论据反对它,那么描述性评论将不胜感激
| 归档时间: |
|
| 查看次数: |
60773 次 |
| 最近记录: |