我意识到这个问题被问了很多。但我无法找出这个问题的解决方案。
我试图解决的问题是创建三个单独的接口(Singleton Scoped、InstancePerRequest)。
并将所有服务注册到其实现的接口下,而无需手动将它们添加到 DI 容器中。
适用于某些类别类型的 Autofac 扫描组件
Autofac 注册程序集类型
Autofac 程序集扫描 - .NET Core
在你说重复之前听我说完。
我已经为所提出的问题提供了解决方案。但我想搜索整个解决方案,而不是局限于一个项目。我已在服务项目中添加了 autofac 模块,以便它注册服务项目中存在的内容。请参见answer为了更好地理解下面的内容。
我尝试实现多项目扫描,请参阅下面的代码。这是行不通的。
这是我的 Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
这是我的启动类中的配置容器。我忽略了所有其他项目,因为这只是一个新的 ASP.NET Core 项目。
public void ConfigureContainer(ContainerBuilder builder)
{
//builder.RegisterType<EpisodeServices>().As<IEpisodeService>().InstancePerLifetimeScope(); This works
var executingDirectory = AppDomain.CurrentDomain.BaseDirectory;
//The sth is my Solution's header for example Sth.Core, Sth.Models, Sth.Services all are childs to the Sth Solution
string[] files = Directory.GetFiles(executingDirectory, "Sth.*.dll", SearchOption.AllDirectories);
var listOfAssemblies = new List<Assembly>();
foreach (var file in files)
listOfAssemblies.Add(Assembly.LoadFile(file));
builder
.RegisterAssemblyTypes(listOfAssemblies.ToArray())
.Where(t => t.GetInterfaces().Any(i => i.IsAssignableFrom(typeof(ISthScopedService))))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
到目前为止,一切都很好。
这是一个示例服务,以便您可以充分了解我的实现。
public class EpisodeServices : IEpisodeService
{
public IList<Episode> GetEpisodes()
{
return new List<Episode>
{
new Episode { Id = 1, Name = "Some Name", Description = "Some Description" }
};
}
}
这是界面:
public interface IEpisodeService : ISthScopedService
{
IList<Episode> GetEpisodes();
}
这是控制器的注入
public class EpisodeController : Controller
{
private readonly IEpisodeService _episodeService;
public EpisodeController(IEpisodeService episodeService)
{
_episodeService = episodeService;
}
public IActionResult Index()
{
var data = _episodeService.GetEpisodes();
return Content(data[0].Name);
}
}
如果我像这样运行我会得到Invalid Operation Exception: Unable to resolve service for type namespace.IEpisodeService
尝试激活时EpisodeController
.
有人可以提供更多关于如何实现这一目标的实施细节吗?