Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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# 使用Ninject动态绑定UserStore_C#_Asp.net Mvc 5_Ninject_Ninject.web.mvc_Ninject.web - Fatal编程技术网

C# 使用Ninject动态绑定UserStore

C# 使用Ninject动态绑定UserStore,c#,asp.net-mvc-5,ninject,ninject.web.mvc,ninject.web,C#,Asp.net Mvc 5,Ninject,Ninject.web.mvc,Ninject.web,我有以下用户存储: public class UserStoreService<T> : UserStore<T> where T : IdentityUser { public UserStoreService(MainDbContext context) : base(context) { } } public类UserStoreService:UserStore其中T:IdentityUser { 公共UserStoreSe

我有以下用户存储:

public class UserStoreService<T> : UserStore<T> where T : IdentityUser
{
    public UserStoreService(MainDbContext context)
        : base(context)
    {
    }
}
public类UserStoreService:UserStore其中T:IdentityUser
{
公共UserStoreService(MainDbContext上下文)
:基本(上下文)
{
}
}
在我的启动中,我需要将它与来自另一个库的自定义用户绑定。我试图避免在我的项目中引用该库。我有引用的接口,这就是我在整个项目中访问属性等所使用的接口。我不知道如何动态绑定以下语句:

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

MyCustomUser
扩展了
IdentityUser

因此有两种方法可以实现绑定,而无需直接引用实现程序集:

  • 在实现程序集中创建绑定 --ninject功能“模块”有关此功能,请参阅。模块可以通过
    kernel.Load(AppDomain.CurrentDomain.GetAssemblies())加载。
  • 使用反射查找接口的实现并创建绑定 --ninject有一个可以简化事情的工具。在您的案例中,您可能希望使用定制的
    IBindingGenerator
    。 --当然,您也可以推出自己的实现

不过,有一点需要提醒的是,许多人会说您应该使用一个组合根,因此您实际上应该从中引用实现程序集,并在组合根中创建绑定。请参阅。

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

那么你是说选项2是一个更好的方法,使用反射?我很难弄清楚如何编写这样做的代码。你能给我举个例子吗?我最大的问题是,我必须提供一个类型(MyCustomUser)。UserStoreService位于服务dll中,其中MyCustomUser位于模型dll中。这两个项目都没有被直接引用,只有他们的合同(接口)。@Bagzli展示了如何使用它,另外在Stackoverflow上有很多关于这个的问题和答案。我的观点是,仅反射的方法有点脆弱,实际上我更喜欢模块——但是如果您想编写不太依赖容器的软件然后你应该写一个适当的组合根-正如马克·希曼所描述的。是的,我已经经历了所有这些,但我仍然无法理解如何编写代码。嗨,克里斯,我相信我对接口的使用有很强的理解。是的,您的语句是正确的,您必须引用绑定到ninject时使用的dll,但您可以动态地这样做。我的项目永远不会知道我的实现dll,我会通过字符串告诉ninject我的项目的名称,它会动态地加载绑定。我已经有了这个简单类型的工作。我的问题是,当我有强制类型的类时,我不知道如何绑定它们。