2014-11-23 2 views
2

Я использую Виндзорский замок много в проекте я работаю над и использовать декоратор немного, так что я мог бы иметь что-то подобное в моем инсталлятореЕсть ли способ явным образом регистрировать открытые общие декоратор с Виндзорским замком

Component.For<IMyViewModelService>().ImplementedBy<MyViewModelServiceCacheDecorator>().LifestyleTransient() 
Component.For<IMyViewModelService>().ImplementedBy<MyViewModelService>().LifestyleTransient() 

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

https://simpleinjector.readthedocs.org/en/latest/advanced.html#decorators

ли Виндзорский замок иметь любую функциональность, которая позволяет вам делать то же самое в этом декларативно? Я использую замок windsor 3.3 и всегда остаюсь с последним.

Я вижу этот вопрос, который вроде похож, но не имеет полного результата registering open generic decorators for typed implementations in castle windsor

+0

Я прочитал несколько вопросов о Stackoverflow об общих декораторах с Castle ([здесь] (https://stackoverflow.com/questions/26387133), [здесь] (https://stackoverflow.com/questions/24084504/), [здесь] (https://stackoverflow.com/questions/17087489)), и Castle по-прежнему не имеет никакой хорошей поддержки для этого, и вместо этого они рекомендуют перехватчики (yuck !!). Тем не менее, последний ответ, который я мог найти у Кшиштофа Козьмича [датируется сентябрем сентября] (https://stackoverflow.com/questions/12637216/how-can-i-register-a-generic-decorator-using-castle-windsor), поэтому я не уверен, что это все еще точно. – Steven

+0

Но если Simple Injector поддерживает вашу архитектуру, но Castle не делает, зачем придерживаться Castle? – Steven

+1

Очень хороший момент, слишком большое усилие, чтобы измениться в этот момент в проекте, получив покупку за перемену, которая, вероятно, займет 2-3 человеко-дня. Я не уверен, что смогу качать. Это дает мне массу боеприпасов, говорящих, что мы не должны использовать Castle для будущих проектов. Для записи мне нравится ваш простой инжектор намного больше, документы также потрясающие! – Neil

ответ

0

Может быть, я не понимая, что вы пытаетесь сделать, но замок поддерживает открытые общие декораторы просто отлично. Учитывая эти объекты:

public interface IService<T> 
{ 
    void Info(); 
} 

public class Service<T> : IService<T> 
{ 
    public void Info() 
    { 
     Console.WriteLine(GetType()); 
    } 
} 

public class ServiceDecorator<T> : IService<T> 
{ 
    readonly IService<T> service; 

    public ServiceDecorator(IService<T> service) 
    { 
     this.service = service; 
    } 

    public void Info() 
    { 
     Console.WriteLine(GetType()); 
     service.Info(); 
    } 
} 

И это регистрация и разрешение:

container.Register(Component.For(typeof(IService<>)).ImplementedBy(typeof(ServiceDecorator<>))); 
container.Register(Component.For(typeof(IService<>)).ImplementedBy(typeof(Service<>))); 

Тогда решения и обслуживание вызова Info:

IService<int> service = container.Resolve<IService<int>>(); 
service.Info(); 

напечатает:

Sample.ServiceDecorator`1[System.Int32] 
Sample.Service`1[System.Int32] 

Если это не, что вы пытаетесь сделать, уточните свой вопрос с более точным примером.

+0

Достаточно честно, я бы не сказал, что это явно говорит - украсьте это тем, что это то, чего я хочу. – Neil

+2

Но обертывание открытой общей реализации открытым открытым декоратором не является очень распространенным вариантом использования. Обычно у вас есть не общие реализации какого-то общего интерфейса и вы хотите обернуть их с помощью открытого родового декоратора. Можете ли вы показать, как это сделать? – Steven

+2

Я прямо спрашиваю о не-общих реализациях, потому что в этом случае ваш пример не удастся. @Neil, вы уверены, что пример Патрика - это поведение, в котором вы нуждаетесь? – Steven

Смежные вопросы