相关疑难解决方法(0)

asp.net mvc的Ninject和Filter属性的依赖注入

我正在为asp.net mvc 3编写自定义授权过滤器.我需要向用户服务注入类,但我不知道如何做到这一点.

public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    private IUserService userService;
    private string[] roles;

    public AuthorizeAttribute(params string[] roles)
    {
        this.roles = roles;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用ninject进行依赖注入.我不想使用Factory或服务定位器模式.

我的绑定在global.acsx中看起来像这样:

    internal class SiteModule : NinjectModule
    {
        public override void Load()
        {
            Bind<IUserService>().To<UserService>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc ninject asp.net-mvc-3

56
推荐指数
4
解决办法
2万
查看次数

ASP.NET MVC3 + ActionFilterAttribute +注入?

嘿那里,我已经成功地在我的FilterAttribute中使用了属性注入,但是我想知道它是否可以将它移动到构造函数中呢?

我目前的代码:

// AuthAttribute.cs

public class AuthAttribute : ActionFilterAttribute
{
    public Roles _authRoles { get; private set; }

    [Inject]
    private readonly IAuthorizationService _service;

    public AuthAttribute(Roles roles)
    {
        _authRoles = roles;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
            string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
            string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;

            filterContext.HttpContext.Response.Redirect(loginUrl, true);
        }
        else
        {
            bool isAuthorized = _service.Authorize(GetUserSession.Id, _authRoles.ToString());

            if (!isAuthorized)
            {
                // TODO: Make custom "Not Authorized" error page.
                throw new UnauthorizedAccessException("No access"); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net dependency-injection actionfilterattribute asp.net-mvc-3

10
推荐指数
2
解决办法
6289
查看次数

自定义授权MVC 3和Ninject IoC

我有一个自定义授权类,它继承自FilterAttribute并实现IAuthorizationFilter.我正在使用最新版本的Ninject w/asp.net MVC 3支持.

我遇到的问题是我使用构造函数注入来注入存储库.但是在调用OnAuthorization时,存储库为null.这是代码......

public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        private readonly IMyRepo _MyRepo;

        public MyAuthorizeAttribute() { }
        public MyAuthorizeAttribute(IMyRepo myRepo)
        {
            _MyRepo= myRepo; //this gets initialized
        }


        public void OnAuthorization(AuthorizationContext filterContext)
        {
            _MyRepo.DoStuff(); //<< Null, wtf

        }
    }
Run Code Online (Sandbox Code Playgroud)

过滤器绑定:

Bind<IMyRepo>().To<MyRepo>().InRequestScope();


this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Controller, null).WhenControllerHas<MyAuthorizeAttribute >();
Run Code Online (Sandbox Code Playgroud)

更新: 我注意到的一件事是这个过滤器处于控制器级别.我在行动范围内有其他过滤器似乎正常工作......这可能是原因吗?

更新2: 我已经确认,如果我将过滤器范围更改为action,则存储库可用OnAuthorization(非null).

这在下面工作,但我需要在控制器范围,而不是行动.

this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Action, null).WhenActionMethodHas<MyAuthorizeAttribute >();
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc ninject asp.net-mvc-3

10
推荐指数
2
解决办法
9504
查看次数

将值注入注入的依赖项

我有这样的事情:

class Root
{
    public Root(IDependency dep)
    {}
}
class Dependency:IDependency
{
    public Dependency(int val)
    {}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用ninject获取对Root的引用.所以我这样配置它

var module = new InlineModule(mod => mod.Bind<IDependency>().To<Dependency>());

var kernel = new StandardKernel(module);
Run Code Online (Sandbox Code Playgroud)

我想向Dependency注入一些'val'值,这个值仅在从ninject获取Root引用时才知道.

我想做的是这样的事情:

Kernel.Instance.Get<Root>(With.Parameters.ConstructorArgument("val", 12));
Run Code Online (Sandbox Code Playgroud)

使用ninject 1.0是否可以这样?

dependency-injection ninject

8
推荐指数
1
解决办法
6945
查看次数

依赖注入的设置过滤器属性,以接受构造函数中的params

我正在关注此页面上的ninject过滤器属性设置.

对他们来说,他们有:

.WithConstructorArgumentFromControllerAttribute<LogAttribute>(
      "logLevel", attribute => attribute.LogLevel);
Run Code Online (Sandbox Code Playgroud)

第二个参数是期待a Func<LogAttribute, object> callback.他们的实际参数列表设置如下:

Log(LogLevel = Level.Debug)
Run Code Online (Sandbox Code Playgroud)

但我的filter属性设置如下:

public class AuthAttribute : FilterAttribute { }

public class AuthFilter : IAuthorizationFilter
{

    private readonly IUserService userService;
    private string[] roles;

    //Stuck on the constructor also. How do I accept params?
    public AuthFilter(IUserService userService, params string[] roles)
    {
        this.userService = userService;
        this.roles = roles;
    }
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

不知怎的,这是错误的.因为我希望我的过滤器看起来像:

[Auth("Admin", "Contrib")]
Run Code Online (Sandbox Code Playgroud)

我的绑定:

 kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
            .WhenControllerHas<AuthAttribute>()
            .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc ninject asp.net-mvc-3

7
推荐指数
1
解决办法
1933
查看次数