看过NInject如何做到这一点,AutoFac可以做到这一点我试图弄清楚如何使用Castle Windsor将依赖注入MVC ActionFilters
目前我正在使用一个丑陋的静态IoC助手类来解析构造函数代码中的依赖关系,如下所示:
public class MyFilterAttribute : ActionFilterAttribute
{
private readonly IUserRepository _userRepository;
public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { }
public MyFilterAttribute(IUserRepository userRepository)
{
_userRepository = userRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
我想从我的过滤器中删除静态反模式IoC的东西.
任何暗示我将如何与温莎城堡一起做这件事?
不,改变DI框架不是一种选择.
我有一种情况需要在动作过滤器中注入一些依赖项,即我的自定义授权属性中的自定义授权提供程序.我偶然发现了许多人和帖子,他们说我们应该将"属性元数据"与"行为"分开.这是有道理的,而且还有一个事实是过滤器属性没有通过'DependencyResolver'实例化,因此很难注入依赖项.
所以我对我的代码进行了一些重构,我想知道我是否正确(我使用Castle Windsor作为DI框架).
首先,我剥离了我的属性,只包含我需要的原始数据
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : Attribute
{
public string Code { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个自定义授权过滤器,其中包含确定当前用户是否具有适当授权的逻辑
public class MyAuthorizationFilter : IAuthorizationFilter
{
private IAuthorizationProvider _authorizationProvider;
private string _code;
public MyAuthorizationFilter(IAuthorizationProvider authorizationProvider, string code)
{
Contract.Requires(authorizationProvider != null);
Contract.Requires(!string.IsNullOrWhiteSpace(code));
_authorizationProvider = authorizationProvider;
_code = code;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsAuthenticated)
{
BaseController controller = filterContext.Controller as BaseController;
if (controller != null)
{
if …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助 - 我试图在需要进行数据库调用的ASP.NET MVC Web项目中使用自定义验证属性.
我有windsor成功地为控制器工作,并正常注入IRepository接口.当我需要将存储库注入属性类时,问题就出现了.
属性类具有以下代码:
public class ValidateUniqueUrlNodeAttribute : AbstractValidationAttribute
{
private readonly string message;
private readonly IArticleRepository articleRepository;
public ValidateUniqueUrlNodeAttribute(string message)
{
this.message = message;
}
public ValidateUniqueUrlNodeAttribute(string message, IArticleRepository articleRepository):this(message)
{
this.articleRepository = articleRepository;
}
public override IValidator Build()
{
var validator = new UniqueUrlNodeValidator(articleRepository) { ErrorMessage = message };
ConfigureValidatorMessage(validator);
return validator;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我似乎无法让Windsor拦截传递给IArticleRepository的属性的构造
我的global.asax文件中的当前代码如下:
container = new WindsorContainer();
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(Container));
container
.RegisterControllers(Assembly.GetExecutingAssembly())
.AddComponent<IArticleRepository, ArticleRepository>()
.AddComponent<ValidateUniqueUrlNodeAttribute>();
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.