2014-01-04 6 views
2

Я только что прочитал документы на PostSharp.net около Importing Dependencies from the Target Object и нуждаюсь в уточнении с точки зрения сервиса WCF.Инъекция зависимостей в PostSharp

Это мой отделан аспект кэш, в котором я пытаюсь использовать ICACHE с помощью Unity:

[Serializable] 
public class CacheAspect : OnMethodBoundaryAspect, IInstanceScopedAspect 
{ 
    [IntroduceMember(Visibility = Visibility.Family, OverrideAction = MemberOverrideAction.Ignore)] 
    [CopyCustomAttributes(typeof(ImportAttribute))] 
    [Import(typeof(ICache))] 
    public ICache Cache { get; set; } 

    [ImportMember("Cache", IsRequired = true)] 
    public Property<ICache> CacheProperty; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     var cache = this.CacheProperty.Get();    
    }   

    object IInstanceScopedAspect.CreateInstance(AdviceArgs adviceArgs) 
    { 
     return this.MemberwiseClone(); 
    } 

    void IInstanceScopedAspect.RuntimeInitializeInstance() 
    { 
     var container = new UnityContainer(); 
     container.LoadConfiguration(); 

     var distributedCache = container.Resolve<DistributedCache>(); 
     this.CacheProperty.Set(distributedCache); 
    } 
} 

Моя проблема с RuntimeInitializeInstance методом.

Я хотел бы знать, является ли установка CacheProperty в этом методе правильным подходом или я должен делать это по-другому?

ответ

1

Инициализация зависимости ICache в методе [RuntimeInitializeInstance] является одним из правильных подходов, но предоставленная реализация неэффективна, поскольку каждый раз вы создаете и настраиваете новый экземпляр контейнера.

Обычно удобнее разрешить контейнеру DI разрешать вам зависимости, а не устанавливать их вручную.

Атрибут [IntroduceMember] сообщает PostSharp о добавлении свойства Cache непосредственно в ваш класс обслуживания. При разрешении экземпляра службы во время выполнения контейнер Unity может автоматически установить это свойство Cache.

Вы можете указать Unity установить значение свойства, аннотируя его атрибутом [Dependency] (Annotating Objects for Property (Setter) Injection). Чтобы этот атрибут был скопирован в ваш класс обслуживания, вам также необходимо применить атрибут [CopyCustomAttributes].

[IntroduceMember(Visibility = Visibility.Family, OverrideAction = MemberOverrideAction.Ignore)] 
[CopyCustomAttributes(typeof(DependencyAttribute))] 
[Dependency] 
public ICache Cache { get; set; } 

Атрибуты в вашем примере были скопированы из документации и демонстрируют тот же принцип для контейнера MEF.

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