autofac 相关问题

Autofac(http://autofac.org)是Microsoft .NET的控件反转(IoC)容器。它管理类之间的依赖关系,以便应用程序随着大小和复杂性的增长而易于更改。这是通过将常规.NET类视为组件来实现的。

Autofac 拥有<>

我不太明白Autofac拥有和非拥有的一次性组件之间的区别。 接口 IMessageHandler { 无效句柄(消息消息); } 消息泵类 { 功能 我不太明白 Autofac 自有和非自有一次性组件之间的区别。 interface IMessageHandler { void Handle(Message message); } class MessagePump { Func<Owned<IMessageHandler>> _handlerFactory; public MessagePump(Func<Owned<IMessageHandler>> handlerFactory) { _handlerFactory = handlerFactory; } public void Go() { while (true) { var message = NextMessage(); using (var handler = _handlerFactory()) { handler.Value.Handle(message); } } } } 上面的代码与下面的代码有什么区别: class MessagePump { IMessageHandler _handler; public MessagePump(IMessageHandler handler) { _handler = handler; } public void Go() { while (true) { var message = NextMessage(); _handler.Handle(message); } } } 都是我选择的时候手动处理的,那有什么区别呢? 区别在于,如果不使用 Owned,则不会为 T 及其依赖项创建嵌套的生命周期作用域。如果您手动处置实例,您将不会处置任何注册为 InstancePerLifetimeScope 的依赖项,因为它们现在与您的 MessagePump 位于相同的生命周期范围内。 例如,如果您的处理程序本身依赖于数据库资源,那么一般的想法是您希望它们与您的处理程序一起使用,而不是与我认为长期存在的消息泵一起使用。 使用 Owned<T> 通知 Autofac 您不希望 Autofac 处理您的依赖项,因为您要自己处理。然后 - 您可以/应该使用 using 语句或直接在代码中调用 Dispose() 来处理依赖关系,Dispose() 不会被自动调用。 当你不打算使用 Owned<T> 依赖项时,你不需要自己处理你的依赖项 - Autofac 会在必要时为你做这件事。您不必使用 using 语句,您不必记住依赖项是否是一次性的。

回答 2 投票 0

通过带有 autofac 的单例服务中的委托工厂来确定范围服务

我在 Autofac 中发现了一些与通过委托工厂从单例服务中解析范围服务相关的意外行为。以下行为是预期的还是我误解了

回答 1 投票 0

未找到“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数

当我尝试使用 Xml 配置设置参数时,出现以下错误: 在类型上未找到带有“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数 '...

回答 5 投票 0

如何使用Autofac实现责任链设计模式

我正在尝试使用 Autofac 来实现责任链设计模式,以连接所有内容以进行依赖注入。当我运行示例项目时,我从 Autofac 收到一条消息,指出

回答 1 投票 0

如何捕获控制器激活器异常以记录它们?

我有一个 asp.net Framework 4.8 WebApi2 项目,当我向给定控制器上的操作发送请求时,我收到 500 错误,内容显示这是由于缺少依赖项所致。非常正确,...

回答 1 投票 0

autofac - 无法将 EnableClassInterceptors 与表达式注册或 lambda 注册技术一起使用

以下是我的服务正常注册线路,到目前为止一切正常。我必须使用 EnableClassInterceptors,但由于提供的原因,我无法使用 EnableInterfaceInterceptors...

回答 1 投票 0

替换 Autofac 中的注册

我有一个进行数据处理的应用程序。有 类管道{ IEnumerable 过滤器 {get;放;} 我将过滤器实现注册为 builder.RegisterType<

回答 3 投票 0

使用 autofac 获取所有 IOptions 对象的集合

我希望能够获取在 autofac 中注册的所有 IOptions 的集合,以便我可以将它们保存到自定义 JSON 文件中。就像是: 类选项管理器(IEnumerable IOptions) 我会...

回答 1 投票 0

Hangfire & Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务尚未注册

我正在尝试设置 Hangfire 来定期执行服务中的方法。 然而,AutoFac 抱怨该服务未注册: 程序.cs var serviceCollection = 新

回答 1 投票 0

如何替换Autofac中的IServiceCollection扩展方法?

我正在使用 ASP.Net Core 2.1 构建一个应用程序,并使用 autofac 而不是内置 DI 容器。 现在我有一个疑问:如果我有一个为 IServiceCollec 提供扩展方法的库...

回答 1 投票 0

Azure 表和 EntityFrameworkCore InMemoryDb 的 Autofac 依赖注入

我构建了一个与 Azure 表存储表和 EntityFrameworkCore InMemory 数据库通信的服务类。 公共密封类NotificationService:INotificationService {...

回答 1 投票 0

Autofac 时间驱动的[标记]范围

我正在寻找一种单例作用域,它会在配置的时间间隔内自动配置自身。 尝试使用池化实例,但缺乏清除缓存的 API。 这样的范围存在吗?什么是...

回答 1 投票 0

注册委托时假设 Autofac LifetimeScope 是什么?

我无法从文档中确定这一点。 给定一个注册: builder.RegisterType().As().InstancePerLifetimeScope(); 什么一生...

回答 1 投票 0

使用“WithParameters”Autofac 注入失败

我正在尝试注册我创建的一些端点,但是,Autofac 抛出异常,说我尚未注册我的 BControl 类。这是我的注册码: builder.RegisterType<

回答 1 投票 0

PublishTrimmed 使用 Autofac 程序集扫描

我为我的 C# .NET 6 控制台应用程序启用了 。它使用 Autofac 来注册类型。在某些情况下,我会扫描当前应用程序以查找实现接口的类,如下所示: //

回答 1 投票 0

使用 IServiceProvider.GetRequiredService 对方法进行单元测试会抛出“未注册类型‘<T>’的服务”

我有一个类,它在构造函数中将 IServiceProvider 作为参数,并在 Get() 方法中使用 IServiceProvider.GetRequiredService 返回一个对象。当对这个方法进行单元测试时看看

回答 1 投票 0

使用 MassTransit 将服务注入队列消费者

我有一个配置如下的消费者 .ConfigureServices((hostContext, 服务) => { 服务.AddMassTransit(cfg => { cfg.AddConsumer (); ...

回答 1 投票 0

ExternallyOwned() 在程序集扫描级别不起作用?

我在Assembly AutofacDotMemory中有以下类 公共接口 IOutput:IDisposable { void Write(字符串内容); } 公共类ConsoleOutput:IOutput { 公共无效Wr...

回答 1 投票 0

.NET 6 API 系统.InvalidOperationException

我在一堂课上有这样的 Autofac 模块; 公共类 AutofacBusinessModule:模块 { protected override void Load(ContainerBuilder构建器) { builder.RegisterType 我在一堂课上有这样的 Autofac 模块; public class AutofacBusinessModule:Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<ProductManager>().As<IProductService>(); builder.RegisterType<EfProductDal>().As<IProductDal>(); builder.RegisterType<CategoryManager>().As<ICategoryService>(); builder.RegisterType<EfCategoryDal>().As<ICategoryDal>(); builder.RegisterType<CustomerManager>().As<ICustomerService>(); builder.RegisterType<EfCustomerDal>().As<ICustomerDal>(); builder.RegisterType<RegionManager>().As<IRegionService>(); builder.RegisterType<EfRegionDal>().As<IRegionDal>(); builder.RegisterType<TerritoryManager>().As<ITerritoryService>(); builder.RegisterType<EfTerritoryDal>().As<ITerritoryDal>(); builder.RegisterType<ShipperManager>().As<IShipperService>(); builder.RegisterType<EfShipperDal>().As<IShipperDal>(); builder.RegisterType<EmployeeManager>().As<IEmployeeDal>(); builder.RegisterType<EfEmployeeDal>().As<IEmployeeDal>(); var assembly = System.Reflection.Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces() .EnableInterfaceInterceptors(new ProxyGenerationOptions() { Selector = new AspectInterceptorSelector() }).SingleInstance(); } 我的 API 代码就在那里; [Route("api/[controller]")] [ApiController] public class ProductsController : Controller { private readonly IProductService _productService; public ProductsController(IProductService productService) { _productService = productService; } [HttpGet("getall")] public IActionResult GetAllProducts() { var result = _productService.GetAll(); if (result.Success) { return Ok(result); } return BadRequest(result); } } } 我将其添加到program.cs上,但不起作用,如果较低,我使用.net 6,我会像这样修复它,但我不知道如何修复.net 6,因为启动不再存在。 IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterModule(new AutofacBusinessModule()); }); 我该如何解决这个问题? 它给了我这个错误 System.InvalidOperationException:尝试激活“TAO.WebApi.Controllers.ProductsController”时无法解析类型“TAO.Business.Abstract.IProductService”的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型 type,类型 requiredBy,布尔 isDefaultParameterRequired) 在 lambda_method3( 闭包 , IServiceProvider , Object[] ) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass7_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.g__CreateController|0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ControllerActionInvoker.InvokeInnerFilterAsync() --- 先前位置的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|20_0(ResourceInvoker 调用程序、任务lastTask、状态下一个、范围范围、对象状态、布尔值已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点、任务 requestTask、ILogger 记录器) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文) HEADERS ======= Accept: */* Connection: keep-alive Host: localhost:7019 User-Agent: PostmanRuntime/7.30.0 Accept-Encoding: gzip, deflate, br Postman-Token: fbff062e-ca49-4f37-afc5-e8785afbd43c 尝试使用迁移文档中的以下代码: builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); // Register services directly with Autofac here. Don't // call builder.Populate(), that happens in AutofacServiceProviderFactory. builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacBusinessModule())); 请注意,“旧”通用托管模型在 .NET 6 中仍然有效,不需要使用新的最小托管模型(但您不仅需要将 CreateHostBuilder 方法,还需要将旧 Program.Main 的内容复制到新的 Program 顶级语句文件)。

回答 1 投票 0

Autofac - ASP.NET Core 中操作过滤器中的属性注入

在使用 ASP.NET Web API 2 编写应用程序时,我成功地使用 Autofac 在过滤器级别实现了属性注入。 (下面的示例属于非核心 ASP.NET Web API) builder.Register(x =&...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.