2011-06-15 22 views
7

Asp.net mvc 3, ninject 2.0 ve ninject mvc 3 eklentisini kullanıyorum.Bir yetkilendirme filtresine hizmetleri enjekte etmek için nasıl kullanılır?

Hizmet katmanları filtremde nasıl alabilirim (bu durumda bir yetkilendirme filtresi?).

Yapıcıyı enjekte etmeyi seviyorum, bu mümkün mü ya da mülke enjekte etmek zorunda mıyım?

Ben 2.2 Ninject yükseltilmiş ve nihayet got olsun

Teşekkür

Düzenleme

Ben mülkiyet inject için bu var ama benim özelliği her zaman

[Inject] 
     public IAccountService AccountServiceHelper { get; set; } 


     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // check if context is set 
      if (httpContext == null) 
      { 
       throw new ArgumentNullException("httpContext"); 
      } 

      // check if user is authenticated 
      if (httpContext.User.Identity.IsAuthenticated == true) 
      { 
       // stuff here 
       return true; 
      } 

      return false; 
     } 



    /// <summary> 
    /// Application_Start 
    /// </summary> 
    protected void Application_Start() 
    { 

     // Hook our DI stuff when application starts 
     IKernel kernel = SetupDependencyInjection(); 

     RegisterMaps.Register(); 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

    } 


    public IKernel SetupDependencyInjection() 
    { 
     IKernel kernel = CreateKernel(); 
     // Tell ASP.NET MVC 3 to use our Ninject DI Container 
     DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 

     return kernel; 
    } 

    protected IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
          { 
          new NhibernateModule(), 
          new ServiceModule(), 
          new RepoModule() 
          }; 

     return new StandardKernel(modules); 
    } 


public class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAccountService>().To<AccountService>(); 
    } 

} 

Düzenleme null iş.

Düzenleme 2

denemek ve benim authorize filtresi için yapıcı bir yol yapacağım ama Roller geçmek nasıl emin değilim. Sanırım bunu ninject aracılığıyla yapmak zorundayım?

Düzenleme 3

Bu defa

public class MyAuthorizeAttribute : AuthorizeAttribute 
    { 
     private readonly IAccountService accountService; 

     public MyAuthorizeAttribute(IAccountService accountService) 
     { 
      this.accountService = accountService; 
     } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      return base.AuthorizeCore(httpContext); 
     } 
    } 

    this.BindFilter<MyAuthorizeAttribute>(FilterScope.Controller, 0) 
       .WhenControllerHas<MyAuthorizeAttribute>(); 

    [MyAuthorize] 
    public class MyController : BaseController 
    { 
} 

O istemek bana söyler bir hayır parametre yapıcı olduğunu ne var. Yani bir şey eksik olmalıyım.

cevap

11

Filtrelerdeki sorun, bunların öznitelikleri olmasıdır. Ve eğer bazı bağımlılıklardan beklenen bir öznitelik kurucusu tanımlarsanız, onu hiçbir yönteme asla uygulayamayacaksınız: çünkü özniteliklere geçirdiğiniz tüm değerler derleme zamanında bilinmelidir.

  1. Kullanım Ninject filtre uygulamak global yerine onunla kontrolörleri/eylemleri dekorasyon için:

    public interface IFoo { } 
    public class Foo : IFoo { } 
    
    public class MyFooFilter : AuthorizeAttribute 
    { 
        public MyFooFilter(IFoo foo) 
        { 
    
        } 
    } 
    

    ve sonra kernelinizi:

    Yani temelde iki ihtimal var

    kernel.Bind<IFoo>().To<Foo>(); 
    kernel.BindFilter<MyFooFilter>(FilterScope.Action, 0).When(
        (controllerContext, actionDescriptor) => 
         string.Equals(
          controllerContext.RouteData.GetRequiredString("controller"), 
          "home", 
          StringComparison.OrdinalIgnoreCase 
         ) 
    ); 
    
  2. Özellik enjeksiyonu özelliğini kullanın:

    public interface IFoo { } 
    public class Foo : IFoo { } 
    
    public class MyFooFilter : AuthorizeAttribute 
    { 
        [Inject] 
        public IFoo Foo { get; set; } 
    } 
    

    ve sonra kernelinizi:

    kernel.Bind<IFoo>().To<Foo>(); 
    

    ve özel filtreli bazı kontrolör/eylem süslemek: Bu soruya bakın

    [MyFooFilter] 
    public ActionResult Index() 
    { 
        return View(); 
    } 
    
+0

@Darin Dimitrov - Ben mülkiyet Inject çalışacağız sanırım. Onunla problem yaşıyorum. Gönderiyi güncelleyeceğim. – chobo2

+0

@ chobo2, sahip olduğunuz iki olasılık hakkında verdiğim örneklere göz atın. –

+0

@Darin Dimitrov- Bunu okuyordum -> http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ geriye dönük uyumluluk olduğu için enjekte edilir ve gelecekte değiştirilir sanırım. Seçenek 1 ile gidersem, öznitelik etiketi denetleyicilere/eylem yöntemlerine nasıl bakar. Mülkle devam edersem, neye sahip olduğumu görünce eksik olan neyim var, ama mülküm boş. Bağlama çalışmalarını biliyorum çünkü yapıcıda ciltlemeyi kullanıyorum ve boş değil. – chobo2

İlgili konular