动态绑定UserStore和Ninject

本文关键字:Ninject UserStore 动态绑定 | 更新日期: 2023-09-27 18:01:22

我有以下用户存储:

public class UserStoreService<T> : UserStore<T> where T : IdentityUser
{
    public UserStoreService(MainDbContext context)
        : base(context)
    {
    }
}

在我的启动中,我需要将其与来自另一个库的自定义用户绑定。我试图避免在我的项目中完全引用该库。我有引用的接口,这就是我在整个项目中使用的访问属性等。我不明白的是如何动态绑定下面的语句:

kernel.Bind<IUserStore<MyCustomUser>>().To<UserStoreService<MyCustomUser>>();

MyCustomUser扩展IdentityUser

动态绑定UserStore和Ninject

所以有两种方法可以实现绑定而不直接引用实现程序集:

  • 在实现程序集中创建绑定——ninject features"Modules",见这里。模块可以加载,例如通过kernel.Load(AppDomain.CurrentDomain.GetAssemblies())
  • 使用反射来查找接口的实现和创建绑定ninject有可以简化事情的ninject . extensions . conventions。在您的情况下,您可能希望使用定制的IBindingGenerator。——当然你也可以滚动你自己的实现

一个警告,尽管许多人会说你应该使用一个组合根,因此你应该实际引用实现程序集,并在组合根中创建绑定。参见Mark Seemann的论证

我不确定您是否完全理解接口的作用。它们使您能够交换实现,但这并不意味着您可以对应用程序完全隐藏实现。在你的应用程序的其他地方,你可以引用接口,这很好,但在你的Ninject配置中,你必须告诉它它应该绑定到那个接口,当它遇到它,这意味着你的应用程序必须有一个项目的引用,实现存在,如果只是为了这个。