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

时间:2018-01-06 23:00:08

标签: c# dependency-injection proxy .net-core structuremap

我使用dotnet core 2.0和StructureMap.Microsoft.DependencyInjection进行IoC和依赖注入。我正在尝试创建一个代理类进行验证。我试图暗示IoC的DI在使用ComponentDataAccessorProxy时使用IComponentDataAccessor并且还满足ComponentDataAccessorProxy的{​​{1}}依赖性并满足它的依赖性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
    }
}

尝试失败:

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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

config.For<IComponentDataAccessor>().DecorateAllWith<ComponentDataAccessorProxy>();
config.For<IComponentDataAccessor>().Use<ComponentDataAccessor>();

答案 1 :(得分:0)

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,注册时会给出一个名称,&#34; innerComponentDataAccessor&#34;。

然后&#34;真实&#34; IComponentDataAccessor的注册使用ComponentDataAccessorProxy。当该类的构造函数需要类型为IComponentDataAccessor的参数时,容器将解析上一步中的命名注册。