目前我使用Autofac为IOC和在两个组合物根(一个用于前端和一个用于后端)我注册和解析组件跨越的Service,Business和Data层.
截至目前,我只有一个像'AccountingModule'.现在我要在应用程序中添加几个新模块,名称如下InventoryModule,......
我的问题是我应该在各层之间拆分每个模块类(解决方案1)还是为每个模块分别设置所有层(解决方案2)
解决方案1:
Service Layer
(AccountingMoudle, InventoryModule, ...)
Run Code Online (Sandbox Code Playgroud)
Business Layer
(AccountingMoudle, InventoryModule, ...)
Run Code Online (Sandbox Code Playgroud)
Data Layer
(AccountingModule, InventoryModule, ...)
Run Code Online (Sandbox Code Playgroud)
要么
解决方案2:
AccountingModule
(
Service Layer,
Business Layer,
Data Layer
)
Run Code Online (Sandbox Code Playgroud)
InventoryModule
(
Service Layer,
Business Layer,
Data Layer
)
Run Code Online (Sandbox Code Playgroud)
编辑1
+-----------------------------+ +----------------------------+
+--+AccountingServiceComponent +-+InventoryServiceComponent
| Weak Dependency |
+--+AccountingBusinessComponent <------------------+ +-+InventoryBusinessComponent
| |
+--+AccountingDataComponent +-+InventoryDataComponent
+ +
+-+ GetDocumentByID(int id) +--+GetProductByID(int id)
| |
+-+ SaveDocument(Document d) +--+SaveProduct(Product p)
Run Code Online (Sandbox Code Playgroud)
编辑2 …
c# dependency-injection inversion-of-control autofac autofac-module
几年前,我创建了一套用于 CQRS 的 nuget 包,它使用 AutoFac 模块来连接内部结构。我想在我的 .NET MAUI 开发中使用它,因此我已将它们更新到 .NET 6.0,并且它们很好地链接到我的 MAUI 项目,但我不确定我的注册中缺少什么。我的框架的 AutoFac 模块注册了一个 IDateTimeService,但是当我将其添加到注册类的构造函数中时,它无法解析。
因此,按照 .NET Core 的 AutoFac 指南,我添加了 Populate 调用,然后加载 AutoFac 模块。
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Pages;
using Perigee.Framework.Services;
using Services;
using ViewModels;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
builder.Services.AddSingleton<IAppNavigationService, AppNavigationService>();
builder.Services.AddSingleton<AppShellViewModel>();
builder.Services.AddTransient<MainPageViewModel>();
builder.Services.AddSingleton<AppShell>();
builder.Services.AddSingleton<MainPage>();
// Hook in AutoFac for the PerigeeFramework services
var autofacBuilder = …Run Code Online (Sandbox Code Playgroud) AspNet核心应用
1)像这样的Autofac模块
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//Register my components. Need to access to appsettings.json values from here
}
}
Run Code Online (Sandbox Code Playgroud)
2)步骤1中的模块已注册到 Startup.cs
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModule());
}
Run Code Online (Sandbox Code Playgroud)
如何从中访问appsettings.json值AutofacModule?我需要在内部创建对象AutofacModule并将其用于DI。
该autofac文档状态:
当 Autofac 注入类型为构造函数的参数时,
IEnumerable<ITask>它不会查找提供IEnumerable<ITask>. 相反,容器将找到 ITask 的所有实现并注入所有这些实现。
但实际上,它添加每个已注册类型的次数与已注册的次数相同。因此,如果您按以下方式注册一个课程两次:
builder.RegisterType<A>();
builder.RegisterType<A>();
Run Code Online (Sandbox Code Playgroud)
然后你在枚举中得到两个项目!!在单个模块中,这不是问题,因为您显然会注意仅注册一次您的类型。但是如果你有一个被多个模块注册的共享模块(典型的菱形模块依赖关系图),那么你在枚举中得到的项与共享模块已被其他人注册的一样多......
这是一个错误吗?有没有办法强制枚举为每个实现提供单个项目,如文档中所述,不再有?
我正在尝试使用 Autofac(最新的 NuGet 包)设置 MassTransit,但似乎无法在该ContainerBuilder级别注册消费者。有没有人设法将 MassTransit 与 Autofac 一起使用,尤其是模块?
在下面的示例中,无法解析 DoSomethingConsumer,除非我取消注释该x.AddConsumer行并在构建器上注释注册。
builder.RegisterType<BusControlHostedService>().As<IHostedService>();
builder.RegisterType<DoSomethingConsumer>().AsSelf().AsImplementedInterfaces();
builder.AddMassTransit(x =>
{
//x.AddConsumer<DoSomethingConsumer>();
x.AddBus(componentContext => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host("host", "vhost", h =>
{
h.Username("user");
h.Password("password");
});
cfg.UseExtensionsLogging(componentContext.Resolve<ILoggerFactory>());
cfg.ConfigureEndpoints(componentContext);
}));
x.AddRequestClient<DoSomethingRequest>();
});
Run Code Online (Sandbox Code Playgroud)
https://masstransit-project.com/MassTransit/usage/containers/autofac.html 上的文档似乎是错误的。.AddConsumer构建器上没有扩展方法。
我希望从模块注册消费者,并能够按照约定(如上面的示例)或使用.RegisterEndpoint.
对此的任何帮助将不胜感激。
考虑我有一个使用三个库 lib1、lib2 和 lib3 的应用程序。在每个库中,我都实现了一个Module注册在该库中实现的依赖项。
其中一些实现有自己的依赖项,例如,lib2 和 lib3 可能都需要 lib1 中存在的一些实现。
我的问题是,我是否让 lib2 和 lib3 中的模块在 lib1 中注册模块作为其Load实现的一部分?如果我的应用程序注册了 lib2 和 lib3 的模块,这是否会注册该模块两次?
或者我是否避免让一个模块注册另一个模块,将它留给应用程序,但缺点是启动时可能会丢失某些注册?