但这非常乏味,因为我的程序.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);
}
}
}
}
但我强烈建议不要这么做.
附注:
请确保将这些类型实际放置在不同的程序集中,因为根据注释,它们很可能实际上位于单个程序集中.