【发布时间】:2017-10-15 08:31:24
【问题描述】:
我们有一些处理程序,这些处理程序通过反射在 IoC 中实例化,因为它们不能被引用。这工作得很好,直到我使用 StyleCop 并在命名空间内移动了一些处理程序的使用。突然,我们的算法无法获取特定命令的处理程序。我发现这个看似微不足道的变化确实打破了。
变更前的处理程序:
using System;
using System.Threading;
using System.Threading.Tasks;
using AccessManagement.Common.Configuration;
using AccessManagement.DirectoryServices;
using AccessManagement.Management.AdContact.Commands;
using AccessManagement.Management.AdUser;
using AccessManagement.{NotForYourEyes1};
using AccessManagement.{NotForYourEyes1}.Enums;
using AccessManagement.{NotForYourEyes1}.Extensions;
using AccessManagement.{NotForYourEyes1}.Models;
using Architecture.Core;
using {NotForYourEyes2}.Common;
using {NotForYourEyes2}.Common.Configuration;
namespace AccessManagement.Management.AdContact
{
[EnableHandler]
public class MoveAdContactHandler : IHandleRequest<MoveAdContact, AdUserResponse>
{
public Task<AdUserResponse> Handle(MoveAdContact request, CancellationToken cancellationToken = new CancellationToken())
{
修改后的处理程序:
namespace AccessManagement.Management.AdContact
{
using System;
using System.Threading;
using System.Threading.Tasks;
using AccessManagement.Common.Configuration;
using AccessManagement.DirectoryServices;
using AccessManagement.Management.AdContact.Commands;
using AccessManagement.Management.AdUser;
using AccessManagement.{NotForYourEyes1};
using AccessManagement.{NotForYourEyes1}.Enums;
using AccessManagement.{NotForYourEyes1}.Extensions;
using AccessManagement.{NotForYourEyes1}.Models;
using Architecture.Core;
using {NotForYourEyes2}.Common;
using {NotForYourEyes2}.Common.Configuration;
[EnableHandler]
public class MoveAdContact2Handler : IHandleRequest<MoveAdContact, AdUserResponse>
{
向 IoC 容器注册处理程序的算法:
private static void RegisterBusHandlers(IServiceRegistry serviceRegistry, Func<ILifetime> handlersLifetime)
{
var handlerProvider = new HandlerRegistrator((i, t) =>
{
serviceRegistry.Register(i, t, handlersLifetime());
});
var handlerTypes =
AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => t.GetCustomAttribute<EnableHandlerAttribute>() != null);
foreach (var handlerType in handlerTypes)
{
handlerProvider.RegisterHandler(handlerType);
}
}
总结一下——修改前的handler很好找,修改后的handler根本找不到。这对我和我的团队来说是一种脑筋急转弯。谁能解释一下这种行为吗?
【问题讨论】:
-
我怀疑它可能有这样的效果。也许 StyleCop 也改变了其他东西?
-
@Evk Nah,就是这个。我发誓。用 git 检查。
标签: c# .net reflection namespaces using