我使用结构图作为 IOC 容器。我有三个班A
,B
和C
。A
具有B
和C
作为构造函数依赖项,并且B
具有C
作为构造函数依赖项。我用下图来说明:
A
↗ ↖
/ \
B C
↗
/
C
C 有一个插件列表。我需要,这样的每个实例CPlugIn
都是一个新实例。
如何配置结构图?
我已经做了什么?
这是我最小的不工作示例:
internal class Program
{
private static void Main(string[] args)
{
var container = new Container(
config =>
{
config.For<IA>().Use<A>();
config.For<IB>().Use<B>();
config.For<IC>().Use<C>().AlwaysUnique();
config.For<ICPlugIn>().Add<CPlugIn1>().AlwaysUnique();
config.For<ICPlugIn>().AlwaysUnique().Add<CPlugIn2>();
config.For<ICPlugIn>().AlwaysUnique().Add<CPlugIn3>().AlwaysUnique();
});
var a = container.GetInstance<IA>();
Console.WriteLine(a.ToString());
Console.WriteLine();
Console.ReadLine();
}
}
public interface IA
{
}
public class A : IA
{
public A(IB b, IC c)
{
B = b;
C = c;
}
public IB B { get; }
public IC C { get; }
public override string ToString()
{
var message = $"A: {GetHashCode()}";
message += Environment.NewLine + B;
message += Environment.NewLine + C;
return message;
}
}
public interface IB
{
}
public class B : IB
{
public B(IC c)
{
C = c;
}
public IC C { get; }
public override string ToString()
{
var message = $"B: {GetHashCode()}";
message += Environment.NewLine + " " + C;
return message;
}
}
public interface IC
{
}
public class C : IC
{
public C(IList<ICPlugIn> plugIns)
{
PlugIns = plugIns;
}
public IList<ICPlugIn> PlugIns { get; }
public override string ToString()
{
var message = $"C: {GetHashCode()}";
message += Environment.NewLine + " C.PlugIns:";
PlugIns.ForEach(p => message += Environment.NewLine + ($" {p} {p.GetHashCode()}"));
return message;
}
}
这是输出:
A: 16246551
B: 12001237
C: 40902273
C.PlugIns:
TestingStructureMapsLifecycles.CPlugIn1 32576140
TestingStructureMapsLifecycles.CPlugIn2 24749807
TestingStructureMapsLifecycles.CPlugIn3 21421675
C: 58577354
C.PlugIns:
TestingStructureMapsLifecycles.CPlugIn1 32576140
TestingStructureMapsLifecycles.CPlugIn2 24749807
TestingStructureMapsLifecycles.CPlugIn3 21421675
如您所见:我有不同的 实例C
,但它们共享相同的插件实例。