Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用派生接口注册混凝土类型_C#_.net_Dependency Injection_Simple Injector - Fatal编程技术网

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”吗