2013-12-10 50 views
0

在我們的MvxApplication中,我使用EndingWith方法來註冊我們的存儲庫。MvxException:無法解析類型... IRepository

我在一個不同的項目中使用了這種方法,其中我們的App.cs和我們的存儲庫在同一個項目中,並且一切正常。現在我已經將App.cs移動到單獨的項目中,MvvmCross IOC不會註冊來自核心應用程序的依賴項。

initialize方法

public override void Initialize() { 

    // stuff happens here 

    // Register all repositories 
    CreatableTypes().EndingWith("Repository").AsInterfaces().RegisterAsLazySingleton(); 

    // more stuff happens here 

    // Resolve the DbVersionRepo to run migrations. 
    // This line is breaking 
    var databaseVersionRepository = MvxSimpleIoCContainer.Instance.Resolve <IDatabaseVersionRepository>(); 

} 

存儲庫中的問題

public class DatabaseVersionRepository : RepositoryBase, IDatabaseVersionRepository 
{ 
    // do stuff 
} 

例外

Cirrious.CrossCore.Exceptions.MvxException: Failed to resolve type OurApp.AppCore.Repositories.IDatabaseVersionRepository 
12-10 10:35:43.275 E/mono (24043): 
12-10 10:35:43.275 E/mono (24043): Unhandled Exception: 
12-10 10:35:43.275 E/mono (24043): Cirrious.CrossCore.Exceptions.MvxException: Failed to resolve type OurApp.AppCore.Repositories.IDatabaseVersionRepository 
12-10 10:35:43.275 E/mono (24043): at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.Resolve (System.Type t) [0x00000] in <filename unknown>:0 
12-10 10:35:43.275 E/mono (24043): at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.Resolve[IDatabaseVersionRepository]() [0x00000] in <filename unknown>:0 
12-10 10:35:43.275 E/mono (24043): at OurApp.CustomApp.Core.App.Initialize() [0x00135] in c:\Projects\OurApp\OurApp.Droid\App.cs:63 
12-10 10:35:43.275 E/mono (24043): at Cirrious.MvvmCross.Platform.MvxSetup.CreateAndInitializeApp (IMvxPluginManager pluginManager) [0x00000] in <filename unknown>:0 
12-10 10:35:43.275 E/mono (24043): at Cirrious.MvvmCross.Platform.MvxSetup.InitializeApp (IMvxPluginManager pluginManager) [0x00000] in <filename unknown>:0 
12-10 10:35:43.275 E/mono (24043): at Cirrious.MvvmCross.Platform.MvxSetup.InitializeSecondary() [0x00000] in <filename unknown>:0 
12-10 10:35:43.275 E/mono (24043): at Cirrious.MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.<InitializeFromSplashScreen>b__5 (System.Object ignored) [0x00000] in <filename unknown>:0 
The program 'Mono' has exited with code 0 (0x0). 

這個項目的結構是這樣的。

OurCompany.AppCore 
    \ Repositories 
     \IDatabaseVersionRepository.cs 
     \DatabaseVersionRepository.cs 

OurCompany.CustomApp.Core 
    \ App.cs 

OurCompany.CustomApp.Droid.Ui 
    \ Setup.cs 

我還應該注意,我試過這種方法,但得到了相同的結果。

CreatableTypes().Inherits<IDatabaseVersionRepository>().AsInterfaces().RegisterAsLazySingleton(); 
+1

看到https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control「按照慣例批量註冊」 - 包括非核心組件例如 – Stuart

+0

@stuart喔, 那很棒。在我第一次閱讀時沒有發現。如何讓'.InNamespace(「MyApp.Core.HyperSpace」)'訪問外部DLL而不必使用Type? –

回答

2

根據上面的Stuart的評論,解決當前程序集之外的依賴關係的方法是執行以下操作。

typeof(RepositoryBase).Assembly 
         .CreatableTypes() 
         .EndingWith("Repository") 
         .AsInterfaces() 
         .RegisterAsLazySingleton();