【问题标题】:How to migrate from Autofac to Microsoft Dependency Injection?如何从 Autofac 迁移到 Microsoft 依赖注入?
【发布时间】:2023-03-17 14:00:01
【问题描述】:

我将停止在我的 .NET Core 3.1 应用程序中使用 Autofac 和 Microsoft Dependency Injection。

如何在 DI 中做同样的事情:

builder.RegisterAssemblyTypes(assembly)
    .AsClosedTypesOf(typeof(IEventHandlerRabbitMq<>))
    .InstancePerDependency();

builder.RegisterType<BusPublisher>().As<IBusPublisher>().InstancePerDependency();

builder.RegisterInstance(DefaultJaeger.Create())
    .As<ITracer>()
    .SingleInstance()
    .PreserveExistingDefaults();

【问题讨论】:

  • 在 MS.DI 中没有 RegisterAssemblyTypes 等价物。您必须显式注册每个实现,或者必须使用反射来查找和注册所有实现。
  • 顺便说一句,你知道你可以在你的 .NET Core 应用程序中继续使用 Autofac 吗?
  • Assembly.GetExecutingAssembly() .GetTypes() .Where(item => item.GetInterfaces() .Where(i => i.IsGenericType).Any(i => i.GetGenericTypeDefinition() = = typeof(IEventHandlerRabbitMq)) && !item.IsAbstract && !item.IsInterface) .ToList()
  • .ForEach(assignedTypes => { var serviceType =assignedTypes.GetInterfaces().First(i => i.GetGenericTypeDefinition() == typeof(IEventHandlerRabbitMq)); types.Add(assignedTypes) ; services.AddScoped(serviceType, assignedTypes); });
  • 我可以改用 GetExecutingAssembly 吗?

标签: .net-core dependency-injection autofac


【解决方案1】:

正如Steven 所说,您需要对AsClosedTypesOf 使用反射。有一些示例可以如何实现:

public static void RegisterGenerics(this IServiceCollection services, Assembly assembly, Type genericType)
    {
        AppDomain.CurrentDomain.GetAssemblies()
            .FirstOrDefault(a => a.FullName == assembly.FullName)
            .GetTypes()
            .Where(x => x.IsAssignableFrom(genericType) && !x.IsAbstract && !x.IsInterface)
            .ToList()
            .ForEach(t =>
            {
                services.AddTransient(genericType, t);
            });
    }

然后你就可以在你的启动类中使用它了:

services.RegisterGenerics(Assembly.GetExecutingAssembly(), typeof(IEventHandler<>));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-05
    • 2018-06-21
    • 2020-08-09
    • 2016-11-09
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多