有什么形式可以避免注册所有实现IMediator服务的程序集吗?

我try 使用这些选项,但它们都不能帮助我:

builder.Services.AddMediatR(Assembly.GetExecutingAssembly());

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()))

目前,唯一适合我的 Select 是,如果我像这样注册所有服务:

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(MYQUERY).Assembly));

但这是非常乏味的,因为我的程序.cs将有很多行,有没有其他 Select 来做到这一点?

推荐答案

但这非常乏味,因为我的程序.cs将有很多行

就我个人而言,我会 Select "手动"方法.如果您不想"丢弃"Program.cs,那么您始终可以将安装程序的这一部分移到某个扩展方法:

public static class MediatrRegistrationExts
{
    public static IServiceCollection AddMediatorWithAll(this IServiceCollection services)
    {
        var types = new[]
        {
            typeof(MediatrAssemlyOneLandmark),
            typeof(MediatrAssemlyTwoLandmark)
        };
        services.AddMediatR(types.Select(t => t.Assembly).ToArray());
        return services;
    }
} 

然后:

builder.Services.AddMediatorWithAll();

但如果你真的-真的想要进入全动态模式,那么你可以try 下面这样的方法(未测试):

builder.Services.AddMediatR(GetAllAssemblies().ToArray());

static IEnumerable<Assembly> GetAllAssemblies()
{
    var assemblies = new HashSet<string>();
    var stack = new Stack<Assembly>();

    stack.Push(Assembly.GetEntryAssembly());

    while (stack.Count > 0)
    {
        var asm = stack.Pop();

        yield return asm;

        foreach (var reference in asm.GetReferencedAssemblies())
        {
            if (!assemblies.Contains(reference.FullName))
            {
                stack.Push(Assembly.Load(reference));
                assemblies.Add(reference.FullName);
            }
        }

    }
}

但我强烈建议不要这么做.

附注:

请确保将这些类型实际放置在不同的程序集中,因为根据注释,它们很可能实际上位于单个程序集中.

Csharp相关问答推荐

使用变量子根名称在C#中重新初始化SON文件

在依赖性注入和继承之间进行 Select

EF Core判断是否应用了AsSplitQuery()

C#自定义字典与JSON(de—)serialize

一小时后,自定义缓存停止在App Insight中保存

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

.NET 8 Web-API返回空列表

(乌龙)1&#比c#中的UL&#慢吗?

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

如何注册类使用多级继承与接口

未在数据流块之间传播完成

为什么方法的值在SELECT方法中不会更改?

在C#中有没有办法减少大型数组中新字符串的分配?

Content WithTargetPath实际上是有效的MSBuild项吗?

如何在发布NuGet包之前设置命名空间?

多个选项卡上的MudForm验证

在.NET8中如何反序列化为私有字段?

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

流畅的验证--如何为属性重用规则?

使用postman 测试配置了身份的.NET 6应用程序