如何使用 Simple Injector 将 class 注入我的自定义模型活页夹提供程序?

How to use Simple Injector to inject a class into my custom model binder provider?

我正在尝试在 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 调用,将 blog-post 数据(标题、内容和标签)发送到服务器。标签由一个整数表示,该整数对应于它们在数据库中的唯一 ID。模型绑定器正在对标签的数据库进行查找,然后保存 post.

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

问题:

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

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

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