0

我使用结构图作为 IOC 容器。我有三个班ABCA具有BC作为构造函数依赖项,并且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,但它们共享相同的插件实例。

4

0 回答 0