我想知道是否有人知道是否可以通过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; }
...
提前感谢您的帮助。
<磷>氮答案 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)