2017-06-14 146 views
0

當我嘗試使用具有帶4個參數的實現的接口的類時,Unity中遇到問題。與構造函數參數的統一性和依賴關係

在這裏的錯誤堆棧跟蹤:

Resolution of the dependency failed, type = "Keolis.ODM.Controllers.TypeTacheApiController", name = "(none)". 
↵Exception occurred while: while resolving. 
↵Exception is: InvalidOperationException - The type String cannot be constructed. You must configure the container to supply this value. 
↵----------------------------------------------- 
↵At the time of the exception, the container was: 
↵ 
↵ Resolving Keolis.ODM.Controllers.TypeTacheApiController,(none) 
↵ Resolving parameter "typeTacheService" of constructor Keolis.ODM.Controllers.TypeTacheApiController(Keolis.ODM.Business.ITypeTacheService typeTacheService) 
↵ Resolving Keolis.ODM.Business.TypeTacheService,(none) (mapped from Keolis.ODM.Business.ITypeTacheService, (none)) 
↵ Resolving parameter "mediation" of constructor Keolis.ODM.Business.TypeTacheService(Keolis.Mediation.IMediation mediation, Keolis.ODM.Models.Repositories.ITypeTacheRepository typeTacheRepository, Keolis.Okapi.Models.Repositories.ITypeTacheRepository typeTacheOkapiRepository) 
↵  Resolving Keolis.Mediation.WebService.Mediation,(none) (mapped from Keolis.Mediation.IMediation, (none)) 
↵  Resolving parameter "profilOkapiRepository" of constructor Keolis.Mediation.WebService.Mediation(Keolis.Okapi.Models.Repositories.IProfilOkapiRepository profilOkapiRepository, Keolis.Okapi.Models.Repositories.ISocieteOkapiRepository societeOkapiRepository, Keolis.Okapi.Models.Repositories.ICentreOkapiRepository centreOkapiRepository, Keolis.Okapi.Models.Repositories.IUtilisateurOkapiRepository utilisateurOkapiRepository) 
↵  Resolving Keolis.Okapi.Models.Repositories.ProfilOkapiRepository,(none) (mapped from Keolis.Okapi.Models.Repositories.IProfilOkapiRepository, (none)) 
↵  Resolving parameter "serveur" of constructor Keolis.Okapi.Models.Repositories.ProfilOkapiRepository(System.String serveur, System.String catalog, System.String user, System.String pass) 
↵   Resolving System.String,(none) 
↵" 

而且UnityConfig

public static void RegisterTypes(IUnityContainer container) 
    { 
     // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
     container.LoadConfiguration(); 

     var repository = container.Resolve<ILocalDatabaseService>(); 
     var referentielLocalDatabase = repository.GetRsh(); 

     container.RegisterType<Okapi.Models.Repositories.ITypeHeureRepository, Okapi.Models.Repositories.TypeHeureRepository>(); 
     container.Resolve<Okapi.Models.Repositories.ITypeHeureRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.ITypeTacheRepository, Okapi.Models.Repositories.TypeTacheRepository>(); 
     container.Resolve<Okapi.Models.Repositories.ITypeTacheRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.IUtilisateurOkapiRepository, Okapi.Models.Repositories.UtilisateurOkapiRepository>(); 
     var utilisateur = container.Resolve<Okapi.Models.Repositories.IUtilisateurOkapiRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.ISocieteOkapiRepository, Okapi.Models.Repositories.SocieteOkapiRepository>(); 
     var societe = container.Resolve<Okapi.Models.Repositories.ISocieteOkapiRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.IProfilOkapiRepository, Okapi.Models.Repositories.ProfilOkapiRepository>(); 
     var profil = container.Resolve<Okapi.Models.Repositories.IProfilOkapiRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.ICentreOkapiRepository, Okapi.Models.Repositories.CentreOkapiRepository>(); 
     var centre = container.Resolve<Okapi.Models.Repositories.ICentreOkapiRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Okapi.Models.Repositories.IBuildVersionOkapiRepository, Okapi.Models.Repositories.BuildVersionOkapiRepository>(); 
     container.Resolve<Okapi.Models.Repositories.IBuildVersionOkapiRepository>(new ResolverOverride[] { 
      new ParameterOverride("serveur", referentielLocalDatabase.Serveur), 
      new ParameterOverride("catalog", referentielLocalDatabase.Base), 
      new ParameterOverride("user", referentielLocalDatabase.User), 
      new ParameterOverride("pass", referentielLocalDatabase.Password) 
      }); 

     container.RegisterType<Keolis.Mediation.IMediation, Keolis.Mediation.WebService.Mediation>(new InjectionConstructor(
      new Okapi.Models.Repositories.ProfilOkapiRepository(referentielLocalDatabase.Serveur, referentielLocalDatabase.Base, referentielLocalDatabase.User, referentielLocalDatabase.Password), 
      new Okapi.Models.Repositories.SocieteOkapiRepository(referentielLocalDatabase.Serveur, referentielLocalDatabase.Base, referentielLocalDatabase.User, referentielLocalDatabase.Password), 
      new Okapi.Models.Repositories.CentreOkapiRepository(referentielLocalDatabase.Serveur, referentielLocalDatabase.Base, referentielLocalDatabase.User, referentielLocalDatabase.Password), 
      new Okapi.Models.Repositories.UtilisateurOkapiRepository(referentielLocalDatabase.Serveur, referentielLocalDatabase.Base, referentielLocalDatabase.User, referentielLocalDatabase.Password) 
      )); 

     //container.RegisterType<Keolis.Mediation.IMediation, Keolis.Mediation.WebService.Mediation>(new InjectionConstructor(
     // profil, societe, centre, utilisateur)); 

     //container.Resolve<Keolis.Mediation.IMediation>(new ResolverOverride[] { 
     // new ParameterOverride("profilOkapiRepository", profil), 
     // new ParameterOverride("societeOkapiRepository", societe), 
     // new ParameterOverride("centreOkapiRepository", centre), 
     // new ParameterOverride("utilisateurOkapiRepository", utilisateur) 
     //}); 
    } 

而且IMediation

實施
public Mediation(IProfilOkapiRepository profilOkapiRepository, 
     ISocieteOkapiRepository societeOkapiRepository, 
     ICentreOkapiRepository centreOkapiRepository, 
     IUtilisateurOkapiRepository utilisateurOkapiRepository) 
    { 
     _profilOkapiRepository = profilOkapiRepository; 
     _societeOkapiRepository = societeOkapiRepository; 
     _centreOkapiRepository = centreOkapiRepository; 
     _utilisateurOkapiRepository = utilisateurOkapiRepository; 
     _deser = new Deserializer(); 
    } 

我嘗試了好幾種配置,後面的代碼和網絡。配置,但最後解析(中介)上的錯誤。

那麼,如何註冊一個具有接口參數的類呢?

感謝您的幫助。

編輯:工作代碼

public static void RegisterTypes(IUnityContainer container) 
{ 
    // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
    container.LoadConfiguration(); 

    var repository = container.Resolve<ILocalDatabaseService>(); 
    var referentielLocalDatabase = repository.GetRsh(); 

    // This says "if you ever need need a string called 'xxxx', get that one." 
    container.RegisterInstance<string>("serveur", referentielLocalDatabase.Serveur); 
    container.RegisterInstance<string>("catalog", referentielLocalDatabase.Base); 
    container.RegisterInstance<string>("user", referentielLocalDatabase.User); 
    container.RegisterInstance<string>("pass", referentielLocalDatabase.Password); 

    // Here it says "Find a constructor that needs 4 strings, and use 
    // these registered string. 
    container.RegisterType<Okapi.Models.Repositories.ITypeHeureRepository, Okapi.Models.Repositories.TypeHeureRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.ITypeTacheRepository, Okapi.Models.Repositories.TypeTacheRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.IUtilisateurOkapiRepository, Okapi.Models.Repositories.UtilisateurOkapiRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.ISocieteOkapiRepository, Okapi.Models.Repositories.SocieteOkapiRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.IProfilOkapiRepository, Okapi.Models.Repositories.ProfilOkapiRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.ICentreOkapiRepository, Okapi.Models.Repositories.CentreOkapiRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    container.RegisterType<Okapi.Models.Repositories.IBuildVersionOkapiRepository, Okapi.Models.Repositories.BuildVersionOkapiRepository>(
     new InjectionConstructor(
      new ResolvedParameter<string>("serveur"), 
      new ResolvedParameter<string>("catalog"), 
      new ResolvedParameter<string>("user"), 
      new ResolvedParameter<string>("pass")) 
     ); 

    // Here it says "For IMediation, use the Mediation class". 
    // The constructor you've shown us will required the other interfaces and 
    // the container will be like "I know how to create a class of all of 
    // these interfaces. I'll do that!" 
    container.RegisterType<Mediation.IMediation, Mediation.WebService.Mediation>();    
} 
+0

您是否嘗試在註冊名稱中註冊您的4個輸入接口,簡化您的IMediation註冊:'container.RegisterType ()'並在構造函數中注入一個對象通過註冊名稱公共調解([Dependency(SomeRegisterName)] IProfilOkapiRepository profilOkapiRepository,...)'? –

回答

1

您使用Unity錯誤是還挺(委婉說法)。當你進行註冊時,你幾乎總是隻做註冊,而不是註冊/解決/「使用產品註冊」等等。你想把解決方案和類實例化推遲到最新的負責任的時刻。

此外,使用ParameterOverride應該用於覆蓋您爲特定情況設置的參數,當您註冊的參數不起作用時。在你的情況下,你可以註冊它們。以下是我會怎麼做它:(「Keolis.Mediation」我刪除了「 Okapi.Models」和無處不在的可讀性。)

public static void RegisterTypes(IUnityContainer container) 
{ 
    var repository = container.Resolve<ILocalDatabaseService>(); 
    var referentielLocalDatabase = repository.GetRsh(); 

    // This says "if you ever need need a string called 'xxxx', get that one." 
    container.RegisterInstance<string>("serveur", referentielLocalDatabase.Serveur); 
    container.RegisterInstance<string>("catalog", referentielLocalDatabase.Base); 
    container.RegisterInstance<string>("user", referentielLocalDatabase.User); 
    container.RegisterInstance<string>("pass", referentielLocalDatabase.Password); 

    // Here it says "Find a constructor that needs 4 strings, and use 
    // these registered string. 
    container.RegisterType<Repositories.ITypeHeureRepository, Repositories.TypeHeureRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.ITypeTacheRepository, Repositories.TypeTacheRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.IUtilisateurOkapiRepository, Repositories.UtilisateurOkapiRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.ISocieteOkapiRepository, Repositories.SocieteOkapiRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.IProfilOkapiRepository, Repositories.ProfilOkapiRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.ICentreOkapiRepository, Repositories.CentreOkapiRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    container.RegisterType<Repositories.IBuildVersionOkapiRepository, Repositories.BuildVersionOkapiRepository>(
     new ParameterResolve<string>("serveur"), 
     new ParameterResolve<string>("catalog"), 
     new ParameterResolve<string>("user"), 
     new ParameterResolve<string>("pass")); 

    // Here it says "For IMediation, use the Mediation class". 
    // The constructor you've shown us will required the other interfaces and 
    // the container will be like "I know how to create a class of all of 
    // these interfaces. I'll do that!" 
    container.RegisterType<IMediation, WebService.Mediation>(); 
} 

沒有測試,因爲它的代碼有太多的依賴,但它應該工作。

+0

工作很棒!我現在更瞭解這個概念。如果您想更新您的答案,我已編輯我的問題以添加工作代碼。 –

+0

我很高興它有幫助。你不必更新你的問題。您檢查已經標記的「接受答案」按鈕,對於會有相同問題的其他人(或多或少),這是爲您修復的問題。 :-) – Tipx