【发布时间】:2020-06-03 07:45:56
【问题描述】:
我正在尝试设置一个使用 Autofac 5 IoC Container 的简单 .NET Core 3.1 项目。
我添加了对最新 Autofac.Configuration 5.0.0 package 的引用。
我已经使用简单的 JSON 配置创建了接口、实现和测试应用程序(遵循this guide):
{
"components": [
{
"type": "Implementations.ImplementationN, Implementations",
"services": [
{
"type": "Interfaces.InterfaceN, Interfaces"
}
]
}
]
}
我使用以下代码(根据相同的指南):
using Interfaces;
using Autofac;
using Autofac.Configuration;
using Microsoft.Extensions.Configuration;
using System;
------------------------
var config = new ConfigurationBuilder();
config.AddJsonFile("config.json");
var module = new ConfigurationModule(config.Build());
var builder = new ContainerBuilder();
builder.RegisterModule(module);
var container = builder.Build();
------------------------
但我得到 System.InvalidOperationException:
类型“Implementations.ImplementationN, Implementations” 找不到。它可能需要组装资格, 例如“我的类型,我的程序集”
我已将我的代码上传到GitHub。任何帮助表示赞赏。
P.S. Visual Studio 2019 16.4.5 企业版、Windows 10 1909 x64 专业版
更新:为了澄清更多 - 我的最终目标是让 Interfaces.dll 没有特殊参考,Implementations.dll 参考仅 Interfaces.dll 和 Test.exe 仅参考 Interfaces.dll(当然还有 Autofac 包)。我希望 Autofac 通过反射从特定程序集(在 config.json 中指定)加载特定类。 Unity Container 可以做到这一点,我希望 Autofac IoC 也能做到这一点。
再一次:我需要一个没有任何项目引用 Implementations.dll 的方法,我应该能够更改特定的实现(通过更改 config.json)而无需重新编译。
【问题讨论】:
-
您从未在任何地方注册类型,也没有要加载的模块。最好通过程序集加载模块,并将类型的注册放在单独的模块中
-
你的意思是像
builder.RegisterType<ImplementationN>().As<InterfaceN>();这样的东西吗?但是包含这段代码的库(我们将其命名为 fabric library)应该引用 Implementation.dll,对吗?当我使用 Unity Container fabric library 时,应该只引用 Interface.dll - 所有配置都是配置文件。 Autofac IoC 可以吗? -
是的,可以这样做。你必须这样做:
c# public class ImplementationModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<ImplementationN>().As<InterfaceN>(); } }ImplementationModule 应该在 implementations 项目中。我认为 config.json 文件不正确。见autofaccn.readthedocs.io/en/latest/configuration/… -
但是对于那个方法 实现库 应该引用 Aurofac.dll - 当我使用 Unity 时,这是不必要的。好的,我已经尝试过这种方法:将 ImplementationModule.cs 添加到实施项目并将 config.json 更改为
{ "modules": [ { "type": "Implementations.ImplementationModule, Implementations" } ] }。同样的错误 - 找不到类型“Implementations.ImplementationModule, Implementations”。它可能需要装配资格,例如“我的类型,我的程序集”
标签: c# .net-core dependency-injection inversion-of-control autofac