Unity - 注入属性类

时间:2011-01-05 14:12:33

标签: unity-container

我想知道是否有人知道是否可以通过Unity注入正在类方法上使用的属性类?

更确切地说,我工作的项目是MVC2 ASP.NET类型,其中控制器实例是通过Unity注入的。所有依赖项(例如DB上下文)都在Unity配置文件中配置。

我的问题是,我如何注入自定义属性类,它也使用数据库上下文,即它有依赖?

这是控制器类的摘要:

    public class MyController : Controller
    {
        public IDBContext MyDBContext { get; set; }
...

    [CustomAuthorize]
    public ActionResult Index()
    {
...

    public class CustomAuthorize : AuthorizeAttribute
    {
        public IDBContext2 MyDBContext2 { get; set; }
...

提前感谢您的帮助。

<磷>氮

2 个答案:

答案 0 :(得分:1)

您需要做的是使您的CustomAuthorize属性继承 来自Microsoft.Practices.Unity.InterceptionExtension.HandlerAttribute和 覆盖“ICallHandler CreateHandler(IUnityContainer容器)”方法。

public class CustomAuthorizeAttribute: HandlerAttribute
{
   public IAuthorizeAttributeHandler AuthorizationHandler { get; set; }

    public override ICallHandler CreateHandler(IUnityContainer container)
    {
       AuthorizationHandler= new AuthorizationAttributeHandler
     {
         DBContext = container.Resolve<IDBContext>()
     };
     return AuthorizationHandler;
    }
}

现在从Microsoft.Practices.Unity.InterceptionExtension.ICallHandler创建派生接口并添加您的IDBContext 作为会员。

public interface IAuthorizeAttributeHandler : ICallHandler
{
 IDBContext DBContext;
}

IAuthorizationAttributeHandler实现

public class AuthorizationAttributeHandler : IAuthorizeAttributeHandler
{
public IDBContext DBContext
        {
            get; set;
        }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
         var result = DBContext.DoWork(input.Arguments..);

//// Invoke the handler
            IMethodReturn output = getNext()(input, getNext);

return getNext()(input, getNext);
    }
}

为你的统一配置添加简单的拦截扩展。

unityContainer  
                .AddNewExtension<Interception>()
                .Configure<Interception>()
                .SetInterceptorFor<IYourPageInterface>(new InterfaceInterceptor());

将属性添加到您希望方面执行的接口方法。

[CustomAuthorize]
        ActionResult Index()
        {
    }

希望这会有所帮助 干杯 斯廷

答案 1 :(得分:0)