问题标签 [autofac-module]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1410 浏览

c# - 如何将 Autofac 模块与多租户容器一起使用?

如何将 Autofac 的模块Multitenant包结合使用?

这是我对 Autofac 的引导部分:

我不想打电话给类似的东西

在引导程序中(不需要对此有所了解)。

相反,我想做这样的事情:

我的第一个想法是在为特殊租户注册时检查:

我可以检查 id 并仅在 id 适合的情况下注册,但如果 id 不匹配则返回什么?无效的?什么都不做?对我来说,代码看起来很奇怪/可怕,比如

感觉更自然。但我不知道如何使用 Autofac 开箱即用地实现这一点。我错过了什么?你是怎么解决这个问题的?

0 投票
1 回答
426 浏览

c# - IAutofacActionFilter 注入记录器

我在这个模块中使用 NLog:

一切似乎都很好,除了记录器的名称是空的/错误的。在 的第一行OnComponentPreparingLimitType是 aMeta<Lazy<IAutofacActionFilter>>[]而不是预期的LogControllerActionFilterAttribute。如何获得记录器的正确类型名称?在我的日志中,这是作为记录器名称给出的:

0,文化=中性,PublicKeyToken=b77a5c561934e089]][]

编辑:

这是一个演示此问题的简短而完整的程序。您还需要上面的模块实现。

0 投票
1 回答
4437 浏览

asp.net-web-api2 - 带有 Hangfire 抛出异常 DependencyResolutionException 的 Autofac 作业激活器

我的项目结构是一样的:

https://github.com/MarlabsInc/webapi-angularjs-spa

我已按照以下说明进行操作:

http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html

所以我创建了一个容器作业激活器。

在我的 Bootstrapper.cs

我的启动类有一个方法:

在控制器中:我正在尝试将 2000 张发票的状态更新为“已批准”所以该方法很简单,如下所示:

现在当我在 SQL 中查询时:

我在数据列中得到以下异常:

{"FailedAt":"2015-07-07T10:00:40.9454943Z","ExceptionType":"Autofac.Core.DependencyResolutionException","ExceptionMessage":"没有标签匹配 'AutofacWebRequest' 的范围在范围内可见请求了哪个实例。这通常表明一个注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,从不来自容器本身。","ExceptionDetails":"Autofac.Core.DependencyResolutionException: 从请求实例的范围中看不到带有匹配 'AutofacWebRequest' 的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.\r\n 在 Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope)\r\n 在 Autofac.Core.Resolving.InstanceLookup..ctor(IComponentRegistration 注册,IResolveOperation 上下文,ISharingLifetimeScope mostNestedVisibleScope,IEnumerableCurrent 或 ILifetimeScopeProvider.RequestLifetime,从不来自容器本身。\r\n Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope)\r\n Autofac.Core.Resolving.InstanceLookup..ctor(IComponentRegistration registration, IResolveOperation上下文, ISharingLifetimeScope mostNestedVisibleScope, IEnumerableCurrent 或 ILifetimeScopeProvider.RequestLifetime,从不来自容器本身。\r\n Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope)\r\n Autofac.Core.Resolving.InstanceLookup..ctor(IComponentRegistration registration, IResolveOperation上下文, ISharingLifetimeScope mostNestedVisibleScope, IEnumerable1 parameters)\r\n at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable1 个参数)\r\n 在 Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration 注册,IEnumerable 1 parameters)\r\n at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable1 个参数)\r\n 在 Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration 注册,IEnumerable 1 parameters)\r\n at Autofac.Core.Container.ResolveComponent(IComponentRegistration registration, IEnumerable1 个参数)\r\ n at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable 1 parameters, Object& instance)\r\n at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable1 parameters)\r\n at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)\r\n at Autofac.ResolutionExtensions.Resolve (IComponentContext 上下文,键入 serviceType)\r\n 在 Hangfire.AutofacJobActivator.ActivateJob(键入 jobType)\r\n 在 Hangfire.Common.Job.Activate(JobActivator activator)"}

有人可以帮我理解我做错了什么吗?

0 投票
0 回答
774 浏览

autofac - 使用 Autofac 重复注册

我们正在使用 Autofac builder.RegisterAssemblyModules(assembly) 方法来扫描模块,它工作正常。但是如果一个模块依赖于其他模块,那么我会看到重复注册发生,因为依赖模块也是单独注册的。有什么办法可以避免这种重复。

我正在考虑实现 IRegistrationSources 程序集并尝试避免重复注册。那会是一个好的 ddea 吗?

0 投票
1 回答
2781 浏览

c# - ASP.NET WebAPI 中的 Autofac 模块注册

到目前为止,我已经在我的 MVC 项目中的一个类中完成了类型注册,但我现在正在尝试使用模块来完成它。我的项目结构如下

Project.Data:包含我的实体框架类和 DataContext。我已经重构了我的 datacontect 以实现我通过 autofac 模块 Project.Business注册的接口(IDbContext) :包含注入 IDbContext 实例的业务逻辑类。类实现相应的接口,这些接口也通过 autofac 模块 Project.Web注册:asp.net 项目,它使用程序集扫描来注册所有 autofac 模块

示例代码

项目数据

项目.业务

项目网站

但是,当我尝试调用 api 服务时,出现以下错误

尝试创建类型为“DataController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。

我已经在 RegisterContainer 方法中调试并设置了断点并被调用,我还查看了列出的程序集并列出了我的业务和数据程序集,但我的模块注册从未运行。我究竟做错了什么?

0 投票
0 回答
758 浏览

c# - Autofac - 跨多个容器的 SingleInstance

我有一个动态启动不同进程的应用程序。每个进程都使用一个 autofac CoreModule,并且每个进程都有自己的 Module 用于该进程。

CoreModule 定义了一些组件,这些组件在应用程序的所有进程中必须是 SingleInstance。

例如,假设我已经注册:

问题是,在每个注册 CoreModule 的引导程序上,它们都会创建一个 AcrossComponent 实例,该实例是该 IContainer 上的 SingleInstance。

我设法通过使用 AcrossComponent 作为书单的外观来解决它

当然,这不是我想解决这个需求的方式,Autofac 可能以我找不到的方式解决它。

(已经尝试注册相同的 CoreModule 实例,但它似乎没有任何改变,它只是注册的一个门面)

提前致谢!

编辑1:

该应用程序是一个 Windows 窗体,用户可以在其中配置内容,并包含多个按钮,每个按钮都指向入口点:

有 4 个这样的类,它们就像所有在后台开始处理的东西的入口点。我希望所有这 4 个共享 CoreModule 实例。

0 投票
1 回答
751 浏览

c# - Autofac枚举不适用于类型或模块的多个注册

autofac文档指出:

当 Autofac 注入类型的构造函数参数时,IEnumerable<ITask>它不会寻找提供IEnumerable<ITask>. 相反,容器将找到 ITask 的所有实现并将它们全部注入。

但实际上,它添加每个注册类型的次数与注册的次数一样多。因此,如果您按以下方式注册课程两次:

然后你得到两个项目在枚举中在单个模块中,这不是问题,因为您显然只需要注册一次您的类型。但是,如果您有一个由多个模块注册的共享模块(典型的菱形模块依赖关系图),那么您在枚举中获得的项目与其他人注册的共享模块一样多......

它是一个错误吗?如文档中所述,是否有任何方法可以强制枚举为每个实现提供单个项目,而不是更多?

0 投票
1 回答
245 浏览

mef - 使用 MEF 导入的 Autofac 模块未加载

我有许多程序集,每个程序集都通过使用扩展 Autofac.Module 的类向 Autofac 提供它们的依赖项。我将其中的每一个都装饰为 MEF 导出,例如:

作为客户端应用程序启动的一部分,我收集了所有这些模块,例如:

查看目录时,我可以看到所有组件中的所有模块都存在。

我的问题是如何指示 Autofac 在每个加载的模块上调用 Load 方法?

我在考虑 builder.RegisterAssemblyModules 的一些用法,但还没有(还)有一个如何将其绑定到目录中的尤里卡时刻。

谢谢!

河。

0 投票
0 回答
956 浏览

c# - Autofac WCF 集成

我试图将 autofac 与 WCF 集成一起使用。我正在使用https://code.msdn.microsoft.com/DI-with-WCF-using-Autofac-a3e8cbbb的解决方案。我可以通过添加服务引用来使用服务并调用操作。但是当我尝试使用 WCF 测试客户端或 SOAP UI 时,它没有给出响应。在 WCF 测试客户端中,它给出了异常 -

System.InvalidOperationException:提供的服务类型无法作为服务加载,因为它没有默认(无参数)构造函数。要解决此问题,请将默认构造函数添加到类型,或将类型的实例传递给主机。

我尝试为服务添加无参数构造函数,但之后它在调用服务时给出了另一个异常 -

由于内部错误,服务器无法处理请求。有关该错误的更多信息,请在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪并检查服务器跟踪日志。服务器堆栈跟踪:在 System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(消息回复,MessageFault 故障,字符串操作,MessageVersion 版本,FaultConverter faultConverter)

0 投票
0 回答
96 浏览

c# - 使用反射创建类的实例,其参数由autofac注入

我正在创建一些 WCF 服务,其中我使用 Autofac 作为 IOC。现在我需要使用反射创建其中一个类的实例,其参数由 Autofac 注入。但是当我使用 Activator.CreateInstance 时,由于构造函数不存在,它给出了异常。在我添加了一个无参数的构造函数之后,应该由 Autofac 实例化的构造函数中传递的参数没有被实例化。任何人请帮我修复这个