Unity: Как обеспечить одноэлементные экземпляры для классов с сохранением состояния между экземплярами класса UnityContainer? - PullRequest
2 голосов
/ 20 июня 2010

Приложение, над которым я работаю, требует, чтобы объекты создавались на лету, некоторые из них также используют одноэлементные экземпляры (конечно, основанные на менеджере времени жизни), потому что существует состояние (например, сеансы службы WCF и т. Д.)).

Пока я разрешаю через тот же экземпляр класса UnityContainer, все в порядке, но я думаю, что здесь змея кусает свой хвост:

a) Все ненавидятНаиболее интуитивная идея создания единственного экземпляра UnityContainer - класса

б) В то же время это, кажется, единственное логическое решение

Я имею в виду, серьезно, если есть так много ненавистидля шаблона ServiceLocator - что еще вы тогда предложите?

Редактировать:

Хорошо, я нашел очень хорошее решение.UnityContainer - класс может внедрить себя как синглтон.Вот пример (он написан в очень уродливом стиле, но это подтверждает мою точку зрения):

    static void Main(string[] args)
    {
        var container = new UnityContainer().LoadConfiguration();
        var test = container.Resolve<MyDependant>();
        test.TestTheDependency();

        foreach (var registration in container.Registrations)
        {
            Console.WriteLine(registration.RegisteredType.Name);
        }

        var container2 = container.Resolve<IUnityContainer>();

        Console.WriteLine(container.GetHashCode());
        Console.WriteLine(container2.GetHashCode());
        test.ShowUnityContainerHashCode();

        var testD1 = container.Resolve<ITestDependency>();
        var testD2 = container2.Resolve<ITestDependency>();

        Console.WriteLine(testD1.GetHashCode());
        Console.WriteLine(testD2.GetHashCode());
        test.ShowTestDependencyHashCode();
    }

Показывает 2 блока по 3 раза с одинаковым хэш-кодом, если

  <register type="ITestDependency" mapTo="TestDependency">
    <lifetime type="singleton"/>
  </register>
  <register type="MyDependant" />

установить в app.config.

Очень приятно.Я люблю Unity, серьезно.Это горячая штука.

1 Ответ

1 голос
/ 21 июня 2010

Если вы действительно должны совместно использовать один и тот же экземпляр между несколькими экземплярами UnityContainer, лучшим решением может быть просто разрешить его один раз и впоследствии зарегистрировать экземпляр во всех других экземплярах UnityContainer:

var f = container1.Resolve<IFoo>();
// ..
container42.RegisterInstance<IFoo>(f);
// ..

Другая альтернатива, которая представляется, - сделать реализацию истинной Singleton , но при этом зарегистрировать экземпляр в каждом экземпляре контейнера.Это делает подробности реализации , что в игре присутствует синглтон, и устраняет многие недостатки паттерна синглтона, потому что потребители никогда не узнают об этом.

Однако Лучшее решение - использовать только один контейнер .Хотя я могу подумать о нескольких довольно экзотических сценариях, в которых подходит произвольное количество экземпляров контейнера, в подавляющем большинстве случаев один экземпляр контейнера является правильной конфигурацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...