如何使用 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.
所以我在网上看了看,关于我是否应该在模型绑定器中完全接触数据库似乎存在分歧。
问题:
那么,假设可以从模型绑定器中的数据库获取数据,我该如何让 Simple Injector 使用它?
或者,如果不能在模型绑定器中从数据库中获取数据,我应该将其逻辑放在哪里?
您的 PostModelBinderProvider 实际上是一个单例,而 IBlogRepository 是瞬态的或作用域的。最简单的解决方案是将 IBlogRepository 依赖项更改为 Func <IBlogRepository>
并将配置更改为以下内容:
services.AddMvc(config => config.ModelBinderProviders.Insert(0,
new PostModelBinderProvider(
container.GetInstance<IBlogRepository>)));
在 PostModelBinderProvider 中,您现在可以调用委托来获取存储库。
我正在尝试在 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.
所以我在网上看了看,关于我是否应该在模型绑定器中完全接触数据库似乎存在分歧。
问题:
那么,假设可以从模型绑定器中的数据库获取数据,我该如何让 Simple Injector 使用它?
或者,如果不能在模型绑定器中从数据库中获取数据,我应该将其逻辑放在哪里?
您的 PostModelBinderProvider 实际上是一个单例,而 IBlogRepository 是瞬态的或作用域的。最简单的解决方案是将 IBlogRepository 依赖项更改为 Func <IBlogRepository>
并将配置更改为以下内容:
services.AddMvc(config => config.ModelBinderProviders.Insert(0,
new PostModelBinderProvider(
container.GetInstance<IBlogRepository>)));
在 PostModelBinderProvider 中,您现在可以调用委托来获取存储库。