2012-03-13 18 views
6

का उपयोग कर रहा लेख का कहना है कि के एक नंबर पढ़ा है ऐसा करने के तरीके, अर्थात्:इंजेक्शन वर्ग एकता 2 और MVC 3

Stack overflow solution

Brad Wilsons excellent tutorial

ये नज़र आते हैं अच्छी तरह से काम, लेकिन जब मैं यहाँ से

Securing your ASP.NET MVC 3 Application

मैं कुछ दिशा-निर्देश का पालन करें एक फसल आने लगते हैं। मेरे लिए मुद्दा यह है कि जब मैं अपने नियंत्रक एट्रिब्यूट को एक नियंत्रक/क्रिया को सजाने के बजाय ग्लोबलफिल्टर के रूप में जोड़ता हूं। यद्यपि निर्भरता संकल्पकों को बुलाया जाता है और मेरे सार्वजनिक संपर्क [निर्भरता] संपत्ति को सेट करते हैं, जब यह वास्तव में कोड के उस हिस्से में आता है जहां मैं AuthorizeAttribute की ऑन-प्राधिकरण() विधि को ओवरराइड कर रहा हूं, मेरी सार्वजनिक [निर्भरता] विशेषता शून्य है।

जब मैं इसे वैश्विक फ़िल्टर से हटा देता हूं और नियंत्रक को सजाने के लिए ऐसा लगता है।

यदि अधिक जानकारी आवश्यक है तो मैं कोड पोस्ट कर सकता हूं।

संपादित करें:

global.asax.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    {       
     // If I have this here the my [Dependency] attribute does not keep it's value 
     // If I remove it and decorate the controller the [Dependency] attribute keeps it value 
     filters.Add(new BasicAuthenticationAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

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

     // injection of services and data contexts 
     var container = new UnityContainer(); 

     // injections for services 
     RegisterUnityServices(container); 

     // Filter provides to allow injection into attribute filters 
     RegisterUnityFilters(container); 

    } 

    private void RegisterUnityServices(UnityContainer container) 
    { 
     container.RegisterType<IDataContext, CDAXDataContext>(); 

     container.RegisterType<IUploadService, UploadService>(); 
     container.RegisterType<IAuthenticationService, AuthenticationService>(); 

     // add more services here ...    
     DependencyResolver.SetResolver(new Models.UnityDependencyResolver(container));    
    } 

    private void RegisterUnityFilters(UnityContainer container) 
    { 
     var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); 
     FilterProviders.Providers.Remove(oldProvider); 

     var provider = new UnityFilterAttributeFilterProvider(container); 
     FilterProviders.Providers.Add(provider);    
    } 

मेरे एकता कक्षाएं ब्रैड Wilsons उदाहरण से लिया:

public class UnityDependencyResolver : IDependencyResolver 
{ 
    readonly IUnityContainer _container; 

    public UnityDependencyResolver(IUnityContainer container) 
    { 
     this._container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return _container.Resolve(serviceType); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return _container.ResolveAll(serviceType); 
     } 
     catch 
     { 
      return new List<object>(); 
     } 
    } 
} 
आगे इस यहाँ पर विस्तार करने के लिए मेरे कोड के कुछ है

और

public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider 
{ 
    private IUnityContainer _container; 

    public UnityFilterAttributeFilterProvider(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     var filters = base.GetFilters(controllerContext, actionDescriptor); 

     foreach (var filter in filters) 
     { 
      _container.BuildUp(filter.Instance); 
     } 

     return filters; 
    } 

    protected override IEnumerable<FilterAttribute> GetControllerAttributes(
       ControllerContext controllerContext, 
       ActionDescriptor actionDescriptor) 
    { 

     var attributes = base.GetControllerAttributes(controllerContext, 
                 actionDescriptor); 
     foreach (var attribute in attributes) 
     { 
      _container.BuildUp(attribute.GetType(), attribute); 
     } 

     return attributes; 
    } 

    protected override IEnumerable<FilterAttribute> GetActionAttributes(
       ControllerContext controllerContext, 
       ActionDescriptor actionDescriptor) 
    { 

     var attributes = base.GetActionAttributes(controllerContext, 
                actionDescriptor); 
     foreach (var attribute in attributes) 
     { 
      _container.BuildUp(attribute.GetType(), attribute); 
     } 

     return attributes; 
    } 
} 

और मेरा बेसिक प्रमाणीकरण एट्रिब्यूट का आधार जहां मेरे पास [निर्भरता] संपत्ति सेट की जा रही है लेकिन पर प्राधिकरण विधि को निकाल दिया गया है, तो मान को बनाए रखना नहीं है।

public class BasicAuthenticationAttribute : AuthorizeAttribute 
{ 
    [Dependency] 
    public IAuthenticationService Authentication { get; set; } 

    private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) 
    { 
     validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // code here that uses the Authentication attribute but it's null 
    } 

उत्तर

3

क्या आपको यह हल हो गया? मैं तुम्हें विशेषता कक्षा में DependencyResolver कॉल करने की आवश्यकता सुनिश्चित नहीं हैं कि अगर [Dependency] विशेषता यहां काम करता है ... OnAuthorization विधि कॉल IAuthenticationService authentication = DependencyResolver.Current.GetService<IAuthenticationService>();

+0

नहीं मैंने नहीं किया में ऐसा लगता है ...। मुझे यह अजीब लगता है कि अगर मैं नियंत्रक को सजाने में काम करता हूं तो यह काम करता है लेकिन अगर मैं इसे global.ascx में डालता हूं तो काम नहीं करता है। मैं आपकी विधि को जाने दूंगा लेकिन मैं वास्तव में एकता का उपयोग करके डीआईपी के माध्यम से इसे लागू करने की उम्मीद कर रहा था। फिलहाल यह काम कर रहा है लेकिन विधि में बताया गया है कि मैं नियंत्रक को सजाने और इसे वैश्विक फ़ाइल में शामिल नहीं करता हूं। – dreza

+0

मुझे वही व्यवहार मिला, नियंत्रक में ठीक काम किया, लेकिन विशेषता/फ़िल्टर में नहीं ... यह सिर्फ वहां नहीं है, इसलिए मुझे निर्भरता रिसेल्वर को कॉल करने की आवश्यकता है। Http://stackoverflow.com/users/759701/ethan-cabiac से बहुत ही रोचक टिप्पणी "यह पंजीकृत नहीं है कि वे पंजीकृत हैं या नहीं, यह इस बारे में है कि वे तत्काल कैसे हैं। अनिवार्य रूप से, ढांचा नए प्रमाणीकरण() को कॉल कर रहा है जो किसी को छोड़ देता है डी-कंटेनर "इस प्रश्न में http://stackoverflow.com/questions/6121050/mvc-3-unity-2-inject- निर्भरता-into-a-filter – w4ik

संबंधित मुद्दे