我正在尝试在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能够使用它?
或者,如果从模型绑定器中的数据库中获取数据不合适,我会在哪里放置逻辑?
答案 0 :(得分:0)
您的PostModelBinderProvider实际上是一个单例,而IBlogRepository是瞬态或作用域。最简单的解决方案是将IBlogRepository依赖项更改为Func <IBlogRepository>
,并将配置更改为以下内容:
services.AddMvc(config => config.ModelBinderProviders.Insert(0,
new PostModelBinderProvider(
container.GetInstance<IBlogRepository>)));
在PostModelBinderProvider中,您现在可以调用委托来获取存储库。