C# 用派生接口注册混凝土类型
考虑到这些类型的继承性,不知道如何注册它们C# 用派生接口注册混凝土类型,c#,.net,dependency-injection,simple-injector,C#,.net,Dependency Injection,Simple Injector,考虑到这些类型的继承性,不知道如何注册它们 public interface ICommandHandler<in TCommand> { void Handle(TCommand command); } public abstract class AbstractCommandHandler<T> : ICommandHandler<T> { public abstract void Handle(T command);
public interface ICommandHandler<in TCommand>
{
void Handle(TCommand command);
}
public abstract class AbstractCommandHandler<T> : ICommandHandler<T>
{
public abstract void Handle(T command);
}
public interface ILoginCommandHandler : ICommandHandler<object>{}
public class LoginCommandHandler : AbstractCommandHandler<object>, ILoginCommandHandler
{
public override void Handle(object command){}
}
公共接口ICommandHandler
{
无效句柄(TCommand命令);
}
公共抽象类AbstractCommandHandler:ICommandHandler
{
公共抽象无效句柄(T命令);
}
公共接口ILoginCommandHandler:ICommandHandler{}
公共类LoginCommandHandler:AbstractCommandHandler、ILoginCommandHandler
{
公共重写无效句柄(对象命令){}
}
目前,我正在做以下工作:
var container = new Container();
container.Register<ICommandHandler<object>, LoginCommandHandler>();
container.Register<ILoginCommandHandler, LoginCommandHandler>();
container.Verify();
var instance = container.GetInstance<ILoginCommandHandler>();
instance.Handle(new object());
var container=newcontainer();
container.Register();
container.Register();
container.Verify();
var instance=container.GetInstance();
Handle(新对象());
这是可行的,但我想知道这是否是正确的方法。ILoginCommandHandler只是识别命令和减少代码混乱的一种更简单的方法。此外,如果我以后需要的话,我可以在那里添加特定的其他方法
另外,我将有至少一百个这样的,所以我想在每个卫星组件中使用一个包。注册来自多个附属程序集的包的最佳方法是什么。我发现有时候SimpleInjector不喜欢我将注册放在哪里(或者我只是做错了)。我理解您如何尽量减少代码中泛型类型的使用,但这样做完全不允许应用泛型decoros。能够在大量的命令处理程序实现中轻松应用装饰程序是使用
ICommandHandler
抽象的最有力的理由之一。例如,只需使用以下注册:
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(TransactionCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(DeadlockRetryCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(ValidationCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(SecurityCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler),
类型(TransactionCommandHandlerDecorator));
容器.注册表记录器(类型为(ICommandHandler),
类型(DeadlockRetryCommandHandlerDecorator);
容器.注册表记录器(类型为(ICommandHandler),
类型(ValidationCommandHandlerDecorator));
容器.注册表记录器(类型为(ICommandHandler),
类型(SecurityCommandHandlerDecorator);
但是,如果您希望解析ILoginCommandHandler
,这意味着所有注册的装饰程序都需要实现ILoginCommandHandler
。否则,您的容器将永远无法返回这样的装饰器。在装饰器上应用一到两个这样的接口并没有那么糟糕,但是如果
“将有至少一百个这样的”接口,这将导致不可行的情况
即使目前没有任何装饰程序,我也建议不要这样做,因为拥有这些接口完全不允许在将来添加横切关注点,这将导致出现代码混乱的情况,就像您目前看到的额外的泛型类型一样
如果我以后需要的话,我可以在那里添加特定的其他方法
您不应该这样做,因为这与此模式所基于的原则完全冲突。为什么消费者需要更多的方法来执行那个用例?这两种方法是两种不同的用例吗?这些方法中有一种是有效的吗?当你这样做的时候,你将打破五个坚实原则中的三个(如前所述)。它再次禁止应用横切关注点,并且不要忘记,通过引入数百个接口,您再次引入了复杂性。现在您有了一个非常简单(通用)的抽象。这使您的应用程序设计非常清晰。我理解您如何尽量减少代码中泛型类型的使用,但这样做完全不允许应用泛型decoros。能够在大量的命令处理程序实现中轻松应用装饰程序是使用
ICommandHandler
抽象的最有力的理由之一。例如,只需使用以下注册:
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(TransactionCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(DeadlockRetryCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(ValidationCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(SecurityCommandHandlerDecorator<>));
container.RegisterDecorator(typeof(ICommandHandler),
类型(TransactionCommandHandlerDecorator));
容器.注册表记录器(类型为(ICommandHandler),
类型(DeadlockRetryCommandHandlerDecorator);
容器.注册表记录器(类型为(ICommandHandler),
类型(ValidationCommandHandlerDecorator));
容器.注册表记录器(类型为(ICommandHandler),
类型(SecurityCommandHandlerDecorator);
但是,如果您希望解析ILoginCommandHandler
,这意味着所有注册的装饰程序都需要实现ILoginCommandHandler
。否则,您的容器将永远无法返回这样的装饰器。在装饰器上应用一到两个这样的接口并没有那么糟糕,但是如果
“将有至少一百个这样的”接口,这将导致不可行的情况
即使目前没有任何装饰程序,我也建议不要这样做,因为拥有这些接口完全不允许在将来添加横切关注点,这将导致出现代码混乱的情况,就像您目前看到的额外的泛型类型一样
如果我以后需要的话,我可以在那里添加特定的其他方法
您不应该这样做,因为这与此模式所基于的原则完全冲突。为什么消费者需要更多的方法来执行那个用例?这两种方法是两种不同的用例吗?这些方法中有一种是有效的吗?当你这样做的时候,你将打破五个坚实原则中的三个(如前所述)。它再次禁止应用横切关注点,并且不要忘记,通过引入数百个接口,您再次引入了复杂性。现在您有了一个非常简单(通用)的抽象。这使您的应用程序设计非常清晰。您能否详细说明“SimpleInjector不喜欢我放置注册的位置”。我不知道你这是什么意思。你能详细说明一下“SimpleInjector di”吗