ninject - 在 Ninject 中绑定(bind)通用接口(interface)

标签 ninject

所以,我已经挖了很长一段时间来找到这个问题的答案,但没有运气。

我做错了什么?

Ninject 抛出异常并显示以下消息:

Error activating IModelRepository{User}

No matching bindings are available, and the type is not self-bindable.


这是我的代码:

我有一个通用界面:

public interface IModelRepository<T> where T: IModel
{
    //interface stuff here
}


具体类是:

public UserRepository : IModelRepository<User>
{
    public UserRepository(IDocumentStore documentStore, string databaseName)
    {
        //constructor code here
    }
}


Ninject 模块 Load():

public override void Load()
{
    string databaseName = Properties.Settings.Default.DefaultDatabaseName;

    Bind<IModelRepository<User>>()
        .To<UserRepository>()
        .WithConstructorArgument("documentStore", Kernel.Get<IDocumentStore>())
        .WithConstructorArgument("databaseName", databaseName);
}


Ninject实例化(这是异常发生的地方):

Kernel = new Ninject.StandardKernel(new DIModules.ModelRepositoryModule()
                                   ,new DIModules.DocumentStoreModule());

这是完整的堆栈跟踪:

at Ninject.KernelBase.Resolve(IRequest request) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 359
at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line 263
at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line 37
at xl.view.DIModules.DataStoreModule.Load() in c:\Users\Michael\Google Drive\Projects\Windows\xl\xl.view\DIModules\DataStoreModule.cs:line 18
at Ninject.Modules.NinjectModule.OnLoad(IKernel kernel) in c:\Projects\Ninject\ninject\src\Ninject\Modules\NinjectModule.cs:line 85
at Ninject.KernelBase.Load(IEnumerable`1 m) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 217
at Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 100
at Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 57
at Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:line 46
at xl.view.Program.InitializeApplication() in c:\Projects\Windows\xl\xl.view\Program.cs:line 53
at xl.view.Program.Main() in c:\Windows\xl\xl.view\Program.cs:line 28

最佳答案

 .WithConstructorArgument("documentStore", Kernel.Get<IDocumentStore>())

您可能希望将其更改为 ctx=> Kernel.Get<IDocumentStore>() 。您调用它的方式是在模块 Load() 期间创建对象。 - 这不应该是这种情况 - Moduel Load()方法应该只Bind()东西。

此外,手头没有开发环境,但很确定应该有一种方法让默认配置负责将该 ctor 参数绑定(bind)到 DI 将解析的任何内容。

(如果以上都没有意义,您肯定需要提供比您现有的更完整的堆栈跟踪)

关于ninject - 在 Ninject 中绑定(bind)通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024277/

相关文章:

c# - AutoMapper 4.2 和 Ninject 3.2

c# - Ninject 在加载依赖项时抛出异常

c# - 如何将我的数据库上下文注入(inject)我所有的存储库类

c# - 使用 Ninject 过滤构造函数注入(inject)

c# - 你如何根据用户交替 Ninject 绑定(bind)?

asp.net - 如果我使用 InRequestScope(),在哪里执行 DBContext.SaveChanges()

c# - 使用 Ninject 时如何模拟通用 Get 方法并使用 SetUp 方法填充模拟数据库?

c# - 使用 Ninject 2.0 为 C# ASP.NET(非 MVC)注入(inject)依赖项

c# - 具体 .Net 类的依赖注入(inject)

nhibernate - Ninject 会调用 dispose 并关闭 NHibernate Isession 吗?