如何使用Simple Injector将类注入我的自定义模型绑定提供程序?

时间:2017-06-16 22:13:53

标签: c# asp.net-core-mvc simple-injector

我正在尝试在MVC Core中构建一个简单的博客网站。

目前,我有一个自定义模型绑定器提供程序,它看起来像这样(其中IBlogRepository是使用nHibernate的数据库存储库):

public class PostModelBinderProvider : IModelBinderProvider
{
    IBlogRepository _blogRepository;
    public PostModelBinderProvider(IBlogRepository blogRepository)
    {
        _blogRepository = blogRepository;
    }


    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        //code
    }
}

它是这样注册的:

services.AddMvc(config => config.ModelBinderProviders.Insert(0, new PostModelBinderProvider(container.GetInstance<IBlogRepository>())));

但是在尝试运行应用程序时我遇到了这个异常: SimpleInjector.ActivationException: 'The ISession is registered as 'Async Scoped' lifestyle, but the instance is requested outside the context of an active (Async Scoped) scope.'

目前,我的前端发出ajax调用,将博客帖子数据(标题,内容和标签)发送到服务器。标记由整数表示,该整数对应于数据库中的唯一ID。 Model绑定器正在对标记的数据库进行查找,然后保存帖子。

所以我在网上看一下,关于我是否应该在模型绑定器中触摸数据库似乎存在分歧。

问题:

  • 因此,假设可以从模型绑定器中的数据库中获取数据,如何使Simple Injector能够使用它?

  • 或者,如果从模型绑定器中的数据库中获取数据不合适,我会在哪里放置逻辑?

1 个答案:

答案 0 :(得分:0)

您的PostModelBinderProvider实际上是一个单例,而IBlogRepository是瞬态或作用域。最简单的解决方案是将IBlogRepository依赖项更改为Func <IBlogRepository>,并将配置更改为以下内容:

services.AddMvc(config => config.ModelBinderProviders.Insert(0, 
    new PostModelBinderProvider(
          container.GetInstance<IBlogRepository>)));

在PostModelBinderProvider中,您现在可以调用委托来获取存储库。