2013-12-18 30 views
4

註冊一個泛型類型我有一個接口定義如下:如何在MVVMCross

public interface ISerializationStrategy<T> 

,也是一個通用的實現:

public class SerializationStrategy<T> : Core.Strategies.ISerializationStrategy<T> 

當我註冊這個國際奧委會做我有做以下每種類型:

Mvx.RegisterType<ISerializationStrategy<IdentityProvider>,SerializationStrategy<IdentityProvider>>(); 
... each type 

還是有辦法註冊一個開放式泛型(我認爲是什麼公司的C alled)。以下不工作:

Mvx.RegisterSingleton(typeof (ISerializationStrategy<>),typeof (SerializationStrategy<>)); 

感謝

羅斯

回答

2

默認在MvvmCross IoC容器是https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/IoC/MvxSimpleIoCContainer.cs

它維護服務類型的詞典(接口)resolvers(對象其實施IResolver

IResolver的currentl y只支持如何提供實際類型 - 不是泛型類型。因此,此默認IoC容器及其解析器目前無法按照您的要求提供多個實例。


如果你願意,你可以用它知道的家庭類型擴展或替換MvvmCross默認的IoC容器 - 你需要支持該接口是https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/IoC/IMvxIoCProvider.cshttps://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/IoC/MvxSimpleIoCContainer.cs可能對您有用作爲基類。


或者,您可以繼續使用MvxSimpleIoCContainer服務,並可以註冊一個非一般的服務在運行時提供您的類型 - 例如,一些與接口:

public interface ISerializationStrategyFactory 
{ 
    ISerializationStrategy<T> CreateFactory<T>(); 
} 

從你的問題的代碼,我認爲這可能只是實現:

public class SerializationStrategyFactory : ISerializationStrategyFactory 
{ 
    public ISerializationStrategy<T> CreateFactory<T>() 
    { 
     return new SerializationStrategy<T>(); 
    } 
} 

作爲最後一個可選方案,你也可以使用一些反思和foreach循環來確定您當前多次調用哪些類:Mvx.RegisterType<ISerializationStrategy<IdentityProvider>,SerializationStrategy<IdentityProvider>>();

+0

我把它作爲最終選項(反射)不會與單聲道觸摸?我真的很喜歡工廠的選擇,所以我認爲那就是我會做的!謝謝Stuart –

1

我有同樣的問題,並結束每個註冊鍵入我需要的。

private static IEnumerable<Type> MyTypes 
{ 
    get 
    { 
    //Return concrete types, NOT interfaces 
    yield return typeof(MyType<Arg1>); 
    yield return typeof(MyType<Arg2>); 
    //... 
    } 
} 

public override void Initialize() 
{ 
    base.Initialize(); 
    MyTypes.AsInterfaces().RegisterAsLazySingleton(); 
} 

如果你不這樣做,你可以當你從一個接口構建一個泛型類型和具體的泛型類型從未與該類型參數的任何地方都引用在iOS上的問題。

請參閱Xamarin Limited Generics Support