Ninject中的泛型和属性绑定
本文关键字:属性 绑定 泛型 Ninject | 更新日期: 2023-09-27 17:58:55
我正在寻找一种将设置合并到我的web应用程序(asp-mvc)中的好方法。我在NopCommerce中遇到了一个非常好的实现。NopCommerce将这些值存储在数据库表中,并带有名称和值。名称源自类和属性名称(例如customersettings.settingname1)
NopCommerce处理设置的确切方式可以在这个问题中找到:了解如何从数据库加载NopCommCommerce设置
NopCommerce使用Autofac作为DI框架将Settings
绑定到ConfigurationProvider
,如下所示(我是正确的)。
return RegistrationBuilder
.ForDelegate((c, p) => c.Resolve<IConfigurationProvider<TSettings>>().Settings)
.InstancePerHttpRequest()
.CreateRegistration();
在适当的类中,现在可以使用ClientSettings
作为参数,并且它会自动填充数据库中的数据。
我真的很喜欢这个实现,因为它非常灵活。然而,问题是我正在使用Ninject。我尝试了几种方法来获得正确的绑定,但似乎找不到正确的实现。有人知道如何让它发挥作用吗?
编辑:
我找到了一种直接绑定ClientSettings
的方法:
kernel.Bind<ClientSettings>()
.ToMethod(ctx => ctx.Kernel.Get<IConfigurationProvider<ClientSettings>>().Settings)
.InRequestScope();
但是,有办法做到这一点吗?
kernel.Bind<ISettings>()
.ToMethod(ctx => ctx.Kernel.Get<IConfigurationProvider<ISettings>>().Settings)
.InRequestScope();
编辑2
我想我已经接近了,但还是遇到了一些问题。我创建了一个自定义绑定生成器:
public class SettingsBindGenerator : IBindingGenerator
{
static readonly MethodInfo BuildMethod = typeof(SettingsBindGenerator).GetMethod(
"BuildRegistration",
BindingFlags.Static | BindingFlags.NonPublic);
public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
{
var obj = typeof (object).IsAssignableFrom(type);
if (type != null && typeof(ISettings).IsAssignableFrom(type))
{
var buildMethod = BuildMethod.MakeGenericMethod(type);
var methodResult = buildMethod.Invoke(null, new object[]{bindingRoot});
var castedResult = methodResult as IBindingWhenInNamedWithOrOnSyntax<object>;
yield return castedResult;
}
}
static IBindingWhenInNamedWithOrOnSyntax<TSettings> BuildRegistration<TSettings>(IBindingRoot bindingRoot) where TSettings : ISettings, new()
{
return bindingRoot.Bind<TSettings>().ToMethod(
ctx => ctx.Kernel.Get<IConfigurationProvider<TSettings>>().Settings);
}
}
这适用于99%。但是,由于某些原因,buildMethod.Invoke返回BindingConfigurationBuilder,而不是IBindingWhenNamedWithOrOnSyntax。因此,castedResult始终为NULL。有人知道怎么纠正吗?
上次编辑
我不知道为什么,但突然它起作用了!很高兴我终于想通了。Thanx Remo!
您有几个选项:
- 像NopCommerce一样,扫描设置类,并使用反射从第一次编辑中调用注册方法
- 使用约定扩展使用自定义绑定生成器注册实现
ISettings
的所有类https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind - 使用约定扩展来注册实现
ISettings
的所有类,以绑定所有接口。并向Ninject添加一个自定义的IActivationStrategy,它会像NopCommerce那样分配属性