StructureMap:用于自注册实现的层接口

时间:2017-05-22 11:08:18

标签: c# structuremap

我目前正在使用StructureMap建立ASP.Net核心架构。我的图层是:

  • Api(REST连接,控制器,安全等)
  • 逻辑(带逻辑的应用层)
  • DataAccess(与DocumentDB一起使用的存储库模式)
  • 模型
  • 通用

我不想跳层,因此他们之间的知识:

  • Api知道逻辑,模型,共同
  • Logic了解DataAccess,Model,Common
  • DataAccess知道Model,Common
  • 模特不知道
  • Common know Model

我的问题:我通过扫描约定注册StructureMap:

internal static IServiceProvider ConfigureIoC(IServiceCollection services)
{
    var container = new Container();

    container.Configure(
        config =>
        {
            config.Scan(
                _ =>
                {
                    _.AssembliesFromApplicationBaseDirectory();
                    _.AddAllTypesOf(typeof(IRepository<>));
                    _.WithDefaultConventions();
                });

            config.Populate(services);
        });

    var result = container.GetInstance<IServiceProvider>();
    return result;
}

我的问题,我想在DataAccess图层上注册一些服务作为单身人士。但由于API对此一无所知,我不能在这里说出来。 我通常的做法是创建一个Marker-Interface,通过Reflection加载所有这些并调用它们,例如:

public class ServiceRegistration : Common.ServiceProviding.Initialization.IRegisterServices
{
    public void RegisterServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddScoped<Logics.Integration.Rest.IRestProxy, Rest.Implementation.RestProxy>();
    }
}

我找不到StructureMap的一些开箱即用的可能性,但由于他们已经添加了扫描装配件等的功能,我想我错过了一些功能,这可以使这个工作,还是有其他可能性?< / p>

1 个答案:

答案 0 :(得分:1)

您可以在DataAcess层中定义自定义注册表。

bindView()

然后使用if(devoir == 1) { cbdevoir.setVisibility(View.VISIBLE); } else { cbdevoir.setVisibility(View.GONE); }

扫描扫描方法中的所有注册表