StructureMap:自注册实现的层接口
StructureMap: Layer-Interface to self-register Implementations
我目前正在使用 StructureMap 设置 ASP.Net 核心架构。我的图层是:
- Api(REST 连接、控制器、安全等)
- 逻辑(具有逻辑的应用层)
- DataAccess(与 DocumentDB 一起使用的存储库模式)
- 型号
- 普通
我不想跳过层,因此它们之间的知识:
- Api 了解逻辑、模型、通用
- Logic 知道 DataAccess、Model、Common
- DataAccess 知道模型,通用
- 模型不认识任何人
- 众所周知的模型
我的问题:我通过 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()
扫描您扫描方法中的所有注册表
我目前正在使用 StructureMap 设置 ASP.Net 核心架构。我的图层是:
- Api(REST 连接、控制器、安全等)
- 逻辑(具有逻辑的应用层)
- DataAccess(与 DocumentDB 一起使用的存储库模式)
- 型号
- 普通
我不想跳过层,因此它们之间的知识:
- Api 了解逻辑、模型、通用
- Logic 知道 DataAccess、Model、Common
- DataAccess 知道模型,通用
- 模型不认识任何人
- 众所周知的模型
我的问题:我通过 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()