使用 StructureMap.DependencyInjection 在 C# dotnet core 2.0 中简单代理 class 依赖注入

Simple proxy class dependency injection in C# dotnet core 2.0 using StructureMap.DependencyInjection

我正在使用 dotnet core 2.0 和 StructureMap.Microsoft.DependencyInjection 进行 IoC 和依赖注入。我正在尝试创建一个代理 class 进行验证。我试图暗示 IoC 的 DI 在使用 IComponentDataAccessor 时使用 ComponentDataAccessorProxy 并且还满足 ComponentDataAccessorProxy 依赖性 ComponentDataAccessor 并满足它的依赖性 IMongoDatabase没有进入循环依赖异常。我想知道是否有可能。任何帮助将不胜感激。

这是界面:

public interface IComponentDataAccessor
{
    Component SaveComponent(Component componentToAdd);
}

这是具体定义或具体类型:

public class ComponentDataAccessor : IComponentDataAccessor
{
    private readonly IMongoDatabase _database;

    public ComponentDataAccessor(IMongoDatabase database)
    {
      _database = database;
    }

    public Component SaveComponent(Component componentToAdd)
    {
        // actually save the componentToAdd
    }
}

最后这是一个代理 class:

public class ComponentDataAccessorProxy : IComponentDataAccessor
{
    private readonly IComponentDataAccessor _componentDataAccessor;

    public ComponentDataAccessorProxy(IComponentDataAccessor componentDataAccessor)
    {
        _componentDataAccessor = componentDataAccessor;
    }

    public Component SaveComponent(Component componentToAdd)
    {
        // do some validation here, if everything is good then call 
        // concrete class otherwise throw an exception

        return _componentDataAccessor.SaveComponent(componentToAdd);
    }
}

失败的尝试:

var container = new Container();

container.Configure(config =>
{
    // failed attempt #1
    config.Forward<IComponentDataAccessor, ComponentDataAccessorProxy>();

    // failed attempt #2
    config.For<IComponentDataAccessor>().Use<ComponentDataAccessorProxy>();
});

根据文档 here,您应该使用如下内容:

config.For<IComponentDataAccessor>().DecorateAllWith<ComponentDataAccessorProxy>();
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>();
container.Configure(
    config =>
    {
        config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>()
            .Name = "innerComponentDataAccessor";
        config.For<IComponentDataAccessor>().Use<ComponentDataAccessorProxy>()
            .Ctor<IComponentDataAccessor>()
            .Is(c=>c.GetInstance<IComponentDataAccessor>("innerComponentDataAccessor"));
    });

有一个注册说,IComponentDataAccessor 使用 ComponentDataAccessor,并且该注册被赋予了一个名称,"innerComponentDataAccessor"。

然后 IComponentDataAccessor 的 "real" 注册使用 ComponentDataAccessorProxy。当 class 的构造函数需要 IComponentDataAccessor 类型的参数时,容器将解析上一步中的命名注册。