У меня есть это (вымышленное) настольное приложение, которое позволяет менеджерам проектов искать незанятых разработчиков и назначать задач . Модель:
interface IDeveloperFactory
{
IDeveloper CreateDeveloper(string name);
}
interface IDeveloper
{
void WriteCode();
void WriteUnitTest();
}
interface ITask
{
void Complete();
}
class Developer : IDeveloper
{
public Developer(string name) { ... }
public void WriteCode()
{
Console.WriteLine("Developer {0} is writing code... done", name);
}
public void WriteUnitTest()
{
Console.WriteLine("Developer {0} is writing unit test... done", name);
}
}
class WriteCodeTask : ITask
{
public Task(Lazy<IDeveloper> lazyDeveloper) { ... }
public void Complete()
{
var dev = lazyDeveloper.Value;
dev.WriteCode();
}
}
Developer
имеет зависимость времени выполнения, поэтому я буду использовать DeveloperFooFactory
(который настроен как типизированная фабрика) для получения IDeveloper
. Пока используется IDeveloper
, мне также нужны ITask
, которые используют экземпляр разработчика, и моя работа была бы намного проще, если бы я мог просто попросить контейнер разрешить их:
var developerFactory = container.Resolve<IDeveloperFactory>();
var dev1 = developerFactory.CreateDeveloper("dev 1");
var task1 = container.Resolve<ITask>();
task1.Complete(); // uses dev1
var task2 = container.Resolve<ITask>();
task2.Complete(); // uses dev1
container.Release(dev1); // also releases task1 and task2
var dev2 = developerFactory.CreateDeveloper("dev 2");
var task3 = container.Resolve<ITask>();
task3.Complete(); // uses dev2
// task1, task2 and task3 are always different instances
Вопросы:
- Как я могу настроить контейнер для достижения этого? (Я намерен использовать версию 3.0)
- В идеале я бы не стал выпускать
dev1
до создания dev2
(например, создавать dev
одновременно в разных потоках), но мне все еще нужен контейнер для правильного разрешения ITask
... Мне нужно использовать дочерние контейнеры для этого, или, может быть, новый метод BeginScope
в 3.0?
- Также возможно, что разработчик может обрабатывать несколько задач одновременно в разных потоках. Поэтому, когда мне нужна задача, я просто просил контейнер разрешить ее и использовать экземпляр «contextual developer» ... но как?
Я знаю, что могло бы быть проще, если бы не круговая зависимость. Однако кажется, что модель, реальная, я имею в виду, более естественна ...