. Понятно, что я застрял в 2005 году и совсем недавно. Я знаю, что у меня много догоняют, но, поскольку мне не нравится неэффективный код, следующий фрагмент кода (внизу этого вопроса) из учебника SimpleInjector немного озадачен.Почему этот код DI объявляет метод-scope var, а затем назначает его статическому объекту уровня класса?
Проблема заключается в методе BootStrapper()
, который используется для инициализации статического контейнера SimpleInjector.
В этом методе объявляется var container
и назначается новый Container()
. В конце метода область метода container
затем назначается переменной статического уровня container
уровня приложения.
Почему так делается? Должна быть веская причина для того, чтобы сначала назначить контейнер локальному var, а затем, наконец, присвоить переменную переменной static static Container. Для меня это кажется очевидным, избыточным заданием, но если это так, я сомневаюсь, что кто-то это сделает. Что мне не хватает?
Код, приведенный ниже, приведен из кода из документации SimpleInjector. Я понимаю все, что делает код, я просто не понимаю смысла этого дополнительного задания var
.
using System.Windows;
using SimpleInjector;
public partial class App : Application
{
private static Container container; //<-- The static, class-level variable.
// Why not assign to it from the get-go?!
//...snip...
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Bootstrap();
}
private static void Bootstrap()
{
// Create the container as usual.
var container = new Container(); //What's the point of this var?
// Register your types, for instance:
container.RegisterSingle<IUserRepository, SqlUserRepository>();
container.Register<IUserContext, WpfUserContext>();
// Optionally verify the container.
container.Verify();
// Store the container for use by the application.
App.container = container; //Couldn't we have done this from line 1 of this method?
}
}
Источник: SimpleInjector - Windows Presentation Foundation Integration Guide
См. Мой вопрос о должности Кевина. – RLH
Многопоточность - одна из причин, но есть способы, которыми другие части кода могли получить доступ к частично инициализированному объекту. Зарегистрированные типы могут получить к нему доступ (например, WpfUserContext), и если будет создано исключение, метод Bootstrap может не завершить его выполнение, и, следовательно, частично инициализированный объект никогда не станет полностью инициализированным. – lightbricko
Отличная (и несколько очевидная) точка! Да, мне нужно будет немного почитать об этом. Это мой первый проект Injection Dependency Injection, и я буду предоставлять услуги, которые должны будут ссылаться на службы. Я собираюсь обновить свои теги, потому что я начинаю видеть, как это относится к SimpleInjector и DI. – RLH