1

我有以下用户商店:

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

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

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

MyCustomUser延伸IdentityUser

4

2 回答 2

1

所以有两种方法可以在不直接引用 implementation-assembly 的情况下实现绑定:

  • 在实现程序集中创建绑定——为此,ninject 具有“模块”功能,请参见此处。可以加载模块,例如,通过kernel.Load(AppDomain.CurrentDomain.GetAssemblies())
  • 使用反射来查找接口的实现并创建绑定——ninject 有Ninject.Extensions.Conventions可以简化事情。您可能希望IBindingGenerator在您的情况下使用自定义。-- 当然你也可以推出你自己的实现

不过要提醒一句,许多人会说您应该使用组合根,因此您实际上应该从组合根中引用实现程序集并在组合根中创建绑定。参见Mark Seemann 的论证

于 2016-08-08T01:47:51.350 回答
0

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

于 2016-08-08T14:29:31.953 回答