Как настроить LifeStyle на основе интерфейса маркера - PullRequest
1 голос
/ 10 мая 2011

Вопрос:

Как я могу настроить образ жизни своих компонентов, используя (или нет) интерфейс маркера на каждом из них?

Мои правила:

  • , если компонент реализует IAutoInstalledComponent , тогда он должен быть зарегистрирован
  • , если компонент реализует ISingletonComponent тогда жизненный цикл компонента должен быть Singleton
  • , если компонент реализует IAutoInstalledComponent , но не ISingletonComponent он будет иметь PerWebRequest lifestyle

Я видел метод "If" в ComponentRegistration, указанном в ConfigureDelegate метода "Configure", но не смог угадать или получить документацию о том, как его использовать.

Мой текущий код:

// a marker interface which I implement on my components by convention 
// just to know which components to register
public interface IAutoInstalledComponent
{
}

// a marker interface to say that the lifestyle should be Singleton
public interface ISingletonComponent : IAutoInstalledComponent
{
}

// This is my unique installer 
public class AutoInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly()
            .BasedOn<IAutoInstalledComponent>()
             // this is what i want to be Singleton when the component (or service) implements ISingletonComponent                   
            .Configure(c => c.LifeStyle.PerWebRequest)
        );
    }
}

Контекст:

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

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 10 мая 2011

Вы можете фильтровать компоненты, используя Where () в соответствии с реализованными интерфейсами

            container.Register
            (
                AllTypes.FromThisAssembly()
                .Where(c=> c.GetInterface(typeof(LifestyleUponInterface.InterfaceForSingleton).Name)!=null )
                .Configure( c=> c.LifeStyle.Singleton )
            );
            container.Register
            (
                AllTypes.FromThisAssembly()
                .Where(c => c.GetInterface(typeof(LifestyleUponInterface.InterfaceForTransient).Name) != null)
                //.If(Component.IsInNamespace("<yourNamespace>"))
                .Configure(c => c.LifeStyle.Transient)
            );
...