Инъекция в замок зависимости - PullRequest
2 голосов
/ 22 марта 2012

Я должен отметить, что я относительно новичок в Касле, так что пока не знаю, что я с ним делаю.Суть в том, что я пытаюсь создать собственный жизненный цикл объекта с помощью Castle Windsor.Я не совсем уверен, как это должно быть сделано, однако самое близкое приближение, которое я могу найти к тому, как это должно работать, я подробно описал ниже.

Я хочу синглтон, но я не могу выпустить этот тип иназначить новый экземпляр.

т.е.

public interface IMyObject { string text; }

public class MyObject() : IMyObject    {
    public string text;
}

var container = new WindsorContainer();
container.Register(Component.For<IMyObject>().ImplementedBy<MyObject>().LifeStyle.Singleton);

MyObject item = SomeMethodGetInstance(); //Defines scope for instance 1
item = container.Resolve<IMyObject>(item);
Print(item);     

>>instance 1
....

item = container.Resolve<IMyObject>();  //gets instance 1
Print(item); 
>>instance 1
....

item = SomeMethodGetInstance()  //New scope defined, now using instance 2

Я хочу иметь возможность выпустить экземпляр, но определение Синглтона Виндзорсом слишком жестко для моих нужд.

container.Release(item);    //I need to release the current instance, this doesn't work.

или

container.Kernal.ReleaseComponent(item);  //Don't work either.

Итак, когда я устанавливаю новый элемент в качестве текущего, он не возвращается к экземпляру 1.

item = container.Resolve<IMyObject>(item);  //sets the currect instance of MyObject
Print(item); 

>>instance 2

Мне нужно сохранить переменнуюу которого есть пользовательская область, ни Синглтон, ни Переходный процесс не собираются сокращать горчицу для меня.Мне нужно уметь определять область видимости, когда сохраненная переменная входит и выходит из области видимости.

Более конкретно, если у меня есть другой класс B, который зависит от A, то если я получу A извне контейнера, как мне установить A в контейнере?Это нормально в одноэтапном сценарии, но я не могу установить его для переходного сценария, однако, с помощью Singleton, после его установки, я не могу его разблокировать, что необходимо.

Как мне это сделатьэто пожалуйста?

Я хочу сделать это в коде, а не в XML, так как я регистрирую классы динамически.

Ответы [ 3 ]

0 голосов
/ 22 марта 2012

Я хочу синглтон

Стиль жизни по умолчанию для Castle Windsor - singleton.

но я не могу выпустить этот тип и назначить новый экземпляр.

Но тогда это не синглтон.

Как мне это сделать, пожалуйста?

Вы не указали точно, что именно вы хотите сделать. Вы хотите новый экземпляр каждый раз, когда вы звоните Resolve? Это LifeStyle.Transient.

0 голосов
/ 22 марта 2012

Рассматривали ли вы использование собственной фабрики для производства вашего экземпляра?Он может вызывать инфраструктуру DI для создания нового экземпляра в любое время, когда он нужен, но вы можете определить свою собственную логику, чтобы определить, когда ему нужно освободить старый экземпляр.

Этот подход также отвечает на ваш второй вопрос.Класс B не должен принимать A в качестве зависимости, а AFactory.Поскольку B может быть более долгоживущим, чем A, ему необходимо каждый раз запрашивать у фабрики «текущий» экземпляр A.

0 голосов
/ 22 марта 2012

Вы можете зарегистрировать свой компонент как отдельный, как следует

public void Register(string name, Type service, Type impl)
{
   WindsorContainer container = new WindsorContainer();
   IKernel kernel = container.Kernel;
   kernel.AddComponent(name, service, impl, LifestyleType.Singleton);
}

Вы можете освободить компонент следующим образом

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