7

मैं एएसपी.नेट एमवीसी 3 और निनजेक 2.2 का उपयोग करने की कोशिश कर रहा हूं ताकि एक कस्टम एक्शनफिल्टर एट्रिब्यूट में लॉगर ऑब्जेक्ट इंजेक्ट किया जा सके।एमवीसी 3 निलंबन इंजेक्शन निनजे 2.2 + ग्लोबल एक्शन फ़िल्टर

यदि मैं कस्टम नियंत्रक के साथ प्रत्येक नियंत्रक को चिह्नित करता हूं तो मैं इसे काम करने में सक्षम हूं।

हालांकि अगर मैं नियंत्रकों से विशेषता सजावट को हटाता हूं और वैश्विक क्रिया फ़िल्टर का उपयोग करने का प्रयास करता हूं तो मैं इसे काम नहीं कर सकता।

यहाँ कोड है:

App_Start तहत - NinjectMVC3.cs

using NinjectTest.Abstract; 
using NinjectTest.Concrete; 

[assembly:  WebActivator.PreApplicationStartMethod(typeof(NinjectTest.App_Start.NinjectMVC3), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(NinjectTest.App_Start.NinjectMVC3), "Stop")] 

namespace NinjectTest.App_Start 
{ 
using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

using Ninject; 
using Ninject.Web.Mvc; 

public static class NinjectMVC3 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     RegisterServices(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<ILogger>().To<Log4NetLogger>(); 
    }  
} 

}

Global.asax.cs

using System.Web.Routing; 
using NinjectTest.Attributes; 

namespace NinjectTest 
{ 
public class MvcApplication : HttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new TestLoggingAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

    protected void Application_Start() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     AreaRegistration.RegisterAllAreas(); 

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

}

TestLoggingAttribute.cs

using System.Web.Mvc; 
using Ninject; 
using NinjectTest.Abstract; 

namespace NinjectTest.Attributes 
{ 
public class TestLoggingAttribute : ActionFilterAttribute 
{ 
    [Inject] 
    public ILogger _logger { get; set; } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

     var controller = filterContext.RouteData.Values["controller"]; 
     var action = filterContext.RouteData.Values["action"]; 

     _logger.Info("controller: " + controller + " action: " + action); 

     base.OnActionExecuted(filterContext); 
    }  

    } 
} 

HomeController.cs

using System.Web.Mvc; 
using NinjectTest.Attributes; 

namespace NinjectTest.Controllers 
{ 
//[TestLogging] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 

} 
} 

की तरह मैं अगर मैं नियंत्रक यह सब काम करता है में [TestLogging] विशेषता uncomment उल्लेख किया है। हालांकि मैं इसके बजाय एक वैश्विक फ़िल्टर का उपयोग करना चाहता हूँ। क्या कोई मेरी मदद कर सकता है?

उत्तर

22

आपको following blog post उपयोगी मिल सकता है। तो बस अपने RegisterServices विधि में:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ILogger>().To<Log4NetLogger>(); 
    kernel.BindFilter<TestLoggingAttribute>(FilterScope.Global, 0); 
}  

और गुंजाइश में BindFilter विस्तार विधि लाने के लिए एक उचित using निर्देश जोड़ने के लिए भूल नहीं है:

using Ninject.Web.Mvc.FilterBindingSyntax; 
संबंधित मुद्दे