var container = new Container();

container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

container.RegisterInstance<IDbConnection>(new SqlConnection(connectionString));

container.Register<IAdvertRepository, AdvertRepository>(Lifestyle.Scoped);

container.Register<IAdvertService, AdvertService>(Lifestyle.Scoped);
container.Register<ICommentService, CommentService>(Lifestyle.Scoped);
container.Register<IRoleService, RoleService>(Lifestyle.Scoped);
container.Register<IUserService, UserService>(Lifestyle.Scoped);

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
    new SimpleInjectorWebApiDependencyResolver(container);


我在Web API中使用Simple Injector并尝试使用它,但出现错误:


  AdvertController已注册为瞬态,但实现了IDisposable


其他控制器具有相同的错误。

我应该如何解决?

public class AdvertController : ApiController
{
    private readonly IAdvertService _advertService;

    public AdvertController(IAdvertService advertService)
    {
        _advertService = advertService;
    }

    [HttpGet]
    public IEnumerable<AdvertDto> GetAll()
    {
        return _advertService.GetAll();
    }

    [HttpGet]
    public AdvertDto Get(long id)
    {
        return _advertService.Get(id);
    }

    [HttpDelete]
    public void Delete(long id)
    {
        _advertService.Delete(id);
    }
}

最佳答案

对于进入此页面的其他用户,在我们的案例中,SimpleInjector已自动从3.1.1更新到4.3.0,因为另一个软件包依赖于较新的版本,从而破坏了我们的MVC5应用


  XXXController已注册为瞬态,但实现了IDisposable


经过一番调查后,我意识到在更新SimpleInjector时,其他相关软件包(SimpleInjector.Integration.Web,SimpleInjector.Integration.Web.Mvc等)都没有。我更新了这些内容,还不得不更改了

container.RegisterPerWebRequest<T>(...)




container.Register<T>(..., Lifestyle.Scoped)


之后,一切又恢复了。

附言对于注意到其他程序包不应该依赖SimpleInjector的任何人,您是完全正确的。这是一个内部生产的程序包,不小心以某种方式添加了依赖性。我们删除了它,但也认为了解最新的SI软件包是个好主意。

09-10 09:55