StructureMap:自注册实现的层接口

StructureMap: Layer-Interface to self-register Implementations

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

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

我的问题:我通过 Scan-Conventions 注册了 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 对此一无所知,所以我不能在这里说出来。 我通常的方法是创建一个标记接口,通过反射加载它们并调用它们,例如:

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

我找不到 StructureMap 的一些开箱即用的可能性,但由于它们增加了扫描程序集等的功能,我想我错过了一些可能使这项工作可行的功能,或者还有其他可能性?

您可以在数据访问层中定义自定义注册表。

public class DataAccessRegistry : Registry {
    public DataAccessRegistry() {
        For<IWidget>().Singleton().Use<DefaultWidget>();
    }
}

然后使用 _.LookForRegistries()

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