我正在使用Simple Injector作为.Net MVC项目的IoC容器。这是我注册服务的方式。
SimpleInjectorInitializer.cs
public static void Initialize() {
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
//container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle(); // replace last line with this for async/await
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container) {
container.Register<MyDbContext>(Lifestyle.Scoped);
container.Register(typeof(IUnitOfWork<>), typeof(UnitOfWork<>), Lifestyle.Scoped);
container.Register(typeof(IRepository<>), typeof(Repository<>), Lifestyle.Scoped);
container.Register<ICustomerService, CustomerService>(Lifestyle.Scoped);
//what does this do by the way?
//using (container.BeginExecutionContextScope()) {
//}
}
CustomerController
public interface ICustomerService : IService<Customer> {}
public class CustomerService : BaseService<Customer, MyDbContext>, ICustomerService {
public CustomerService(IUnitOfWork<MyDbContext> unitOfWork) : base(unitOfWork) {}
// do stuff
}
public class CustomerController : Controller {
private readonly ICustomerService _service;
public CustomerController(ICustomerService service) {
_service = service;
}
public ActionResult Index() {
var foo = _service.GetById(112); // works
// do stuff
return View();
}
public async Task<int> Foo() { // error out on calling this method
var foo = await _service.GetByIdAsync(112);
return foo.SomeId;
}
}
我的问题是,每当我使用async/await时,ioc都会失败。然后我查看了它的documentation,它为异步方法使用了另一个
LifeStyle
。所以我将DefaultScopeLifeStyle
更改为ExecutionContextScopeLifestyle()
,它出错了我是否需要实现使用asyn/await以及同步方法的混合生活方式?还是我的设计有问题?
错误详细信息(带有
WebRequestLifestyle
)编辑
我已经确认这不是简单注入(inject)器问题,而是this。我试图清理解决方案,删除bin文件夹中的dll,仍然没有运气并出现相同的错误。但是,我将 Controller 更改为ApiController,asyn运行良好。
最佳答案
据我所知,这个问题与简单注入(inject)器及其作用域无关。如果将执行上下文范围包装在Web请求周围(可以通过挂接到request_start和request_end事件来完成此操作),那么您将面临相同的问题。
在Stackoverflow和其余的Interweb上,存在一些与此有关的问题,例如this q/a。
关于c# - .NET MVC的DI/IoC异步/等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42259821/