Переходный компонент зарегистрирован как временный, но реализует неразрывно - PullRequest
0 голосов
/ 26 ноября 2018

Я использую Простой инжектор, но каким-то образом я получаю ошибку, как указано в теме.Я пробовал много вещей, прежде чем решил опубликовать этот вопрос, например, это не работает для меня.Я получаю следующее исключение при вызове Validate:

Сообщение об ошибке проверки:

Конфигурация недействительна.Сообщалось о следующих диагностических предупреждениях:

- [Одноразовый временный компонент] AlbumsController зарегистрирован как временный, но реализует IDisposable.

- [Устранимый временный компонент] ArtistsController зарегистрирован как временный, но реализует IDisposable.

- [Одноразовый временный компонент] HomeController зарегистрирован как временный, но реализует IDisposable.

См. Свойство Error для получения подробной информации о предупреждениях.См. https://simpleinjector.org/diagnostics, как исправить проблемы и как подавить отдельные предупреждения.

Application_Start

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    container = new Container();
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
    container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
    container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);
    container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
    container.Verify();
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}

Visual Studio Debugger hitting on the exception thrown by Verify

Я пытался добавить Lifestyle.Scoped к моим регистрациям следующим образом:

container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);

Контроллеры:

Примечание: репозитории внедряются IDisposable.

public class HomeController : Controller 
{
    ...
}

public class AlbumsController : Controller 
{
    readonly IRepository<Album> _repository;

    public AlbumsController(IRepository<Album> repository)
    {
        _repository = repository;
    }

    ...
}

Другие детали:

  • Мои контроллеры не переопределяют метод protected virtual void Dispose(bool).
  • I'mс помощью Simple Injector v4.4.0
  • Я использую пакеты веб-интеграции v3.2.7

1 Ответ

0 голосов
/ 27 ноября 2018

Основываясь на прилагаемом демонстрационном проекте, я действительно смог воспроизвести проблему.

Проблема в ссылочных пакетах:

<package id="SimpleInjector" version="4.4.0" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web" version="3.2.7" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web.Mvc" version="3.2.7" targetFramework="net46" />

Как вы можете видеть, пакеты для MVCиз другой крупной ветки.

Если вы обновите все до 4.4.0, ваша проблема исчезнет.

Кроме этого, сообщение об ошибке не говорит о том, что вы должны внедрить IDisposable в свои репозитории.SimpleInjector, и любой другой инструмент в этом отношении, не могут решить это за вас.

Вы должны решить для себя, если вам это нужно.Если вы также добавите DbContext, что в любом случае является наилучшей практикой, вам вообще не нужно реализовывать IDisposable в вашем хранилище, если предположить, что текущие реализации не сильно изменятся.

...