如何使用autofac定义属性中使用的依赖项

时间:2011-09-13 07:43:50

标签: attributes autofac

我有一个asp.net mvc应用程序,我正在开发一个自定义属性来保护从CodeAccessSecurityAttribute继承的一些wcf端点。​​

我很难找到如何使用autofac来注入我可以在此属性中使用的服务依赖性。

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class SecuredResourceAttribute : CodeAccessSecurityAttribute
{
    public ISecurityService SecurityService { get; set; }

    public SecuredResourceAttribute(SecurityAction action) : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        // I need access to the SecurityService here
        // SecurityService == null :(
    }
}

我已经尝试从应用程序开始注册属性自动布线,但这不起作用。将依赖项注入属性的最佳方法是什么?

builder.RegisterType<SecuredResourceAttribute>().PropertiesAutowired();

由于

1 个答案:

答案 0 :(得分:1)

你接近这个的方式不会因为几个原因而出现:

  • 在autofac中注册属性将不会执行任何操作,因为您没有使用autofac来实例化该属性。
  • 属性在代码执行之前应用,因此依赖于常量输入。

您将不得不在CreatePermission()方法中使用服务位置模式来定位SecurityService,因为我假设在设置容器之后发出CreatePermission()调用(并且构造函数确实如此)不!)

请记住,ServiceLocation会阻碍您的类可测试性,因为您必须为每个测试配置/设置服务定位器。

请谨慎使用

You should start your journey into ServiceLocation here但老实说,这会让你质疑你的设计。属性是否最适合您承担的角色?也许您应该研究像PostSharp这样的面向方面编程