2015-02-10 22 views
3

我試圖在統一中註冊一個通用庫。我寧願使用反射在引導程序中執行此操作。在Unity中註冊具有反射的泛型

我已經成功實現並測試這個:

container.RegisterType(typeof(MyDll.Repositories.IRepository<>), typeof(MyDll.Repositories.Repository<>), "MyDllRepository"); 

然後解析:

var result = target.Resolve(typeof(My.Repositories.IRepository<MyClass>), "MyDllRepository"); 

的偉大工程。我不喜歡的是我需要在Bootstrapper解決方案中明確引用MyDll。

當我嘗試和註冊信息庫自動使用反射我的引導程序中,像這樣:

private void RegisterDlls(String assembly) 
    { 
     var currentAssembly = Assembly.LoadFrom(assembly); 
     var assemblyTypes = currentAssembly.GetTypes(); 

     var baseName = GetBaseName(currentAssembly.FullName); 

     foreach (var assemblyType in assemblyTypes) 
     { 
      if (assemblyType.IsInterface) 
      { 
       continue; 
      } 

      if (assemblyType.FullName.EndsWith("Service")) 
      { 
       foreach (var requiredInterface in assemblyType.GetInterfaces()) 
       { 
        if (requiredInterface.FullName.EndsWith("Service")) 
        { 
         var typeFrom = assemblyType.GetInterface(requiredInterface.Name); 
         var typeTo = assemblyType; 
         RegisterType(typeFrom, typeTo, true, typeTo.Name); 
        } 
       } 
      } 

     if (assemblyType.Namespace.EndsWith("Repositories")) 
     { 
     foreach (var requiredInterface in assemblyType.GetInterfaces()) 
     { 
     if (requiredInterface.Namespace.EndsWith("Repositories")) 
       { 
     var typeFrom = assemblyType.GetInterface(requiredInterface.Name); 
     var typeTo = assemblyType; 
     string registerName = String.Concat(baseName, "Repository"); 
     _container.RegisterType(typeFrom, typeTo, registerName); 
       } 
    } 
    } 

在解決我得到異常:

Microsoft.Practices.Unity.ResolutionFailedException是由用戶代碼未處理 Message =解析依賴失敗,type =「MyDll.Repositories.IRepository 1[MyDll.Models.MyClass]", name = "MyDllRepository". Exception occurred while: while resolving. Exception is: InvalidOperationException - The current type, MyDll.Repositories.IRepository 1 [MyDll.Models.MyClass],是一個接口,不能構建。 210任何想法?

public class Repository<TModel> : IRepository<TModel> where TModel : class, IModel 
{ 
    [Dependency("MyDllDataProvider")] 
    public IMyDllDataProvider _dataProvider { get; set; } 
    ... 
} 

回答

0

你基本上要註冊的您IRepository<>界面右側任意實現:

MyDll.Repositories.Repository類?

在Unity 3.x中有一種用於這種基於約定的註冊的方法。在容器上,您有一個方法RegisterTypes,它採用不同的參數。要掃描的組件,要查找的接口等...

因此,我認爲這正是你應該做的,並且它對泛型類型完美地工作。

只是一個快速示例,它將掃描「bin」目錄中的所有程序集或任何基本路徑...以及類型名稱上的過濾器。

container.RegisterTypes(
    AllClasses.FromAssembliesInBasePath(), 
    (t) => t.Name.EndsWith("Service") ? new[] { t } : new Type[] { }, 
    WithName.TypeName); 

您可以完全自定義每個過濾器或說明,這些只是簡單的Func方法,可以輕鬆定製。

之後,您應該能夠通過例如,

container.ResolveAll(typeof(IRepository<MyClass>)); 
+0

謝謝。我會試一試。我將首先需要更新到Unity 3.x,我仍然使用Unity 2.0 – user1337493 2015-02-11 19:26:20