gpt4 book ai didi

c# - Ninject - 如何使用 Ninject 实现命令模式?

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:38 29 4
gpt4 key购买 nike

目前,我正在使用 ninject 执行以下绑定(bind)的命令模式:

kernel.Bind<ICommand<InsertParams>>().To<InsertProductCommand>();
kernel.Bind<ICommand<UpdateParams>>().To<UpdateProductCommand>();
kernel.Bind<ICommand<DeleteParams>>().To<DeleteProductCommand>();

我的问题是:这些定义和命令会随着时间的推移而增长。有什么方法可以将所有这些绑定(bind)减少为类似“Bind(typeof(ICommand<>))”的绑定(bind),以便适本地解析每个依赖于泛型类型的接口(interface)?

例如:如果我实现一个实现“ICommand”的“ValidateProductCommand”,则绑定(bind)会自动解析,而无需添加额外的绑定(bind)。

谢谢。

最佳答案

实际上有 Ninject.Extensions.Conventions这可以帮助你。然后这很容易做到:

kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(ICommand<>))
.BindSingleInterface());

完整测试代码(使用 Ninject、Ninject.Extensions.Conventions、xUnit 和 FluentAssertions nuget 包):

using FluentAssertions;
using Ninject;
using Ninject.Extensions.Conventions;
using Xunit;

namespace NinjectTest.ClosedGenericConvention
{
public interface ICommand<TParam> { }

public class FloatCommand : ICommand<float> { }

public class IntCommand : ICommand<int> { }

public class Test
{
[Fact]
public void Fact()
{
var kernel = new StandardKernel();

kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(ICommand<>))
.BindSingleInterface());

kernel.Get<ICommand<float>>().Should().BeOfType<FloatCommand>();
kernel.Get<ICommand<int>>().Should().BeOfType<IntCommand>();
}
}
}

关于c# - Ninject - 如何使用 Ninject 实现命令模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27434210/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com