Приложение, над которым я работаю, требует, чтобы объекты создавались на лету, некоторые из них также используют одноэлементные экземпляры (конечно, основанные на менеджере времени жизни), потому что существует состояние (например, сеансы службы 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, серьезно.Это горячая штука.