2013-12-18 2 views
4

에서 제네릭 형식을 등록하려면 어떻게 :다음과 같이 나는이 인터페이스가 정의한 MVVMCross

public interface ISerializationStrategy<T> 

또한 일반적인 구현 :

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

을 나는 IOC에 내가 가지고 할이 등록 할 때

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

또는이 열린 제네릭을 등록하는 방법 (나는 그것이 다 무엇 먹으 렴 생각입니다 : 각 유형에 대해 다음을 수행합니다 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에 서비스 유형의 사전 (인터페이스)를 유지

(객체입니다 which implement IResolver)

IResolver의 current1 지원되는 y는 일반적인 유형의 유형이 아닌 실제 유형을 제공하는 방법에 대해서만 알고 있습니다. 따라서이 기본 IoC 컨테이너와 해당 리졸버는 현재 요청하는 방식으로 여러 인스턴스를 제공 할 수 없습니다. 지원해야하는 것 인터페이스가 https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/IoC/IMvxIoCProvider.cs하고 https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/IoC/MvxSimpleIoCContainer.cs 당신을 위해 유용 할 수 있습니다 - 당신은, 당신이 유형의 가족에 대해 알고 하나 MvvmCross의 기본 IOC의 컨테이너를 확장하거나 대체 할 수 싶었다면


기본 클래스로.


또는 런타임에 당신의 유형을 공급하기 위해 비 일반 서비스를 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

내가 모노 터치로 작동하지 않을 그것을 마지막 옵션 (반사) 받아보기? 나는 공장 옵션을 정말 좋아해서 내가 할 일을 생각한다. 감사 스튜어트 –

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