繁体   English   中英

PostSharp中的依赖注入

[英]Dependency Injection in PostSharp

我刚刚阅读了PostSharp.net上有关从目标对象导入依赖项的文档,并且需要从WCF服务的角度进行一些说明。

这是我修剪过的缓存方面,我试图通过Unity使用ICache

[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是正确的方法还是应该以不同的方式进行?

[RuntimeInitializeInstance]方法中初始化ICache依赖关系是正确的方法之一,但是所提供的实现效率不高,因为您每次都会创建和配置一个新的容器实例。

通常,让DI容器为您解决依赖关系比手动设置它们更为方便。

[IntroduceMember]属性告诉PostSharp将Cache属性直接添加到您的服务类。 在运行时解析服务实例时,Unity容器可以自动为您设置此Cache属性。

您可以告诉Unity通过使用[Dependency]属性对其进行注释来设置属性值( 为属性(Setter)注入注释对象 )。 为了将此属性复制到您的服务类,您还需要应用[CopyCustomAttributes]属性。

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

您示例中的属性是从文档中复制的,并演示了MEF容器的相同原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM