2

使用微軟統一註冊我以下類型:ASP.NET MVC 3 - 依賴解析器問題當更換公共服務定位器

container.RegisterType(typeof(IRepository<>), typeof(NHibernateRepository<>)); 

在ASP.NET MVC 2的話,我可以做到以下幾點:

var repository = ServiceLocator.Current 
    .GetInstance(typeof(IRepository<>).MakeGenericType(bindingContext.ModelType)); 

但是在版本3中,我已經刪除了服務定位器的所有出現,並實現了新的依賴關係解析器。因此,我將上述內容更改爲:

var repository = DependencyResolver.Current 
    .GetService(typeof(IRepository<>).MakeGenericType(bindingContext.ModelType)); 

但是,現在返回null。

這是我實現依賴解析器的,如果有幫助:

public class UnityDependencyResolver : IDependencyResolver { 
    private readonly IUnityContainer _container; 

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

    public object GetService(Type serviceType) { 
     return typeof(IController).IsAssignableFrom(serviceType) || 
      _container.IsRegistered(serviceType) ? 
      _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 
     return _container.ResolveAll(serviceType); 
    } 
} 

我會很感激,如果有人能告訴我什麼,我做錯了。謝謝

+1

你調試過'GetService'調用嗎?它看起來像你可以以非常特殊的方式返回null。 – Tejs

+0

嗨,感謝,它調用_container.IsRegistered(serviceType)返回null。如果我從GetService方法中刪除條件語句並將其包裝在try catch中(如果拋出異常,則返回null),它工作正常,但理想情況下,我想刪除try/catch,因爲它看起來有點亂。 – nfplee

回答

1

我已經用盡了耐心,並決定去嘗試/趕上我最初試圖避免的方法。這裏是我的新的依賴項解析器:

public class UnityDependencyResolver : IDependencyResolver { 
    private readonly IUnityContainer _container; 

    public UnityDependencyResolver(IUnityContainer container) { 
     _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>(); 
     } 
    } 
} 

希望這會有所幫助。

+0

您是否使用自己的BaseController? –

+0

是的,不知道有什麼區別,讓你記住你。 – nfplee

+1

我想我需要在GetService中做更多的工作,以便在我的控制器中定義服務時解決我的服務問題。這是我在那裏做的。公共對象GetService(Type serviceType){try {return(serviceType.BaseType == typeof(BaseController)|| serviceType.BaseType == typeof(Controller))? _container.Resolve(serviceType):(_ container.IsRegistered(serviceType)?_container.Resolve(serviceType):null);} catch(Exception ex) {todo:記錄錯誤 return null; } } –