And*_*ndy 9 c# structuremap dependency-injection circular-dependency
我在结构图中有最简单的循环依赖 - 类A在其构造函数中依赖于类B,而类B在其构造函数中依赖于类A. 为了打破依赖,我让B类把A类作为属性,而不是构造函数参数,但是structmap仍然抱怨.
我已经看到在其他DI框架中使用此方法破坏了循环依赖 - 这是Structuremap的问题还是我做错了什么?
编辑: 我应该提到类B的属性是一个A类实例的数组,这样连线:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Run Code Online (Sandbox Code Playgroud)
为了澄清,我希望发生以下事件序列:
我希望所有这一切都发生在使用自动装配,如果可能的话......
编辑2:这是一个使用显式连线的简化示例:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
Run Code Online (Sandbox Code Playgroud)
验证配置会导致"使用RequestedType检测到双向依赖性问题:IocTest2.ILoader ..."
StructureMap还可以通过使用延迟解析的解决方法来处理双向情况.
如果你有一个简单的情况ClassA
依赖于ClassB
和ClassB
依赖ClassA
,那么你可以选择其中一个并将依赖项转换为Lazy依赖项.这种方式对我有用,而且这个错误再也没有出现过..
public class ClassA
{
private readonly Lazy<IClassB> _classB;
public ClassA(Lazy<IClassB> classB)
{
_classB = classB;
}
public IClassB ClassB => _classB.Value;
}
public class ClassB
{
public IClassA _classA { get; set; }
public ClassB (IClassA classA)
{
_classA = classA;
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息:http://structuremap.github.io/the-container/lazy-resolution/
你能得到的最接近的是这样的:
x.For<IB>().Use<B>()
.OnCreation((ctx, instance) =>
{
instance.ArrayOfA = new IA[] {new A(instance) };
});
Run Code Online (Sandbox Code Playgroud)
如果A
您想要从容器中解析其他依赖项,您可以从ctx
OnCreation lambda 中检索它们。