我正在使用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/

10-12 19:46