2017-07-14 3 views
0

ユニティ依存性の注入C#でジェネリックインターフェイスのIEnumerableをを注入します。私はと呼ばれるインターフェース作りたいは、私は、Web API 2アプリケーションでの作業とユニティ依存性注入を使用しています

...名、ブランド、タイプ:

私は、フィルタの複数の種類がありIFilterServiceをし、それを実装するために他のすべてのクラスを強制し、私が呼ぶこのインタフェースのIEnumerableをとそれを正しいタイプで注入してください。

インタフェースは次のとおりです。

public interface IFilterService<T> 
{ 
    bool CanHandle(FilterType type); 

    Task<ServiceResult<T>> FilterAsync(T entity); 
} 

とクラスのようなものです:

public class NameService : IFilterService<Name> 
{ 
    public bool CanHandle(FacetType type) 
    { 
     return type == FacetType.Name; 
    } 

    public async Task<ServiceResult<Name>> FilterAsync(Name entity) 
    { 
     // Code 
    } 
} 

コントローラのようなある:

public class FilterController 
{ 
    private readonly IEnumerable<IFilterService> filters; 

    public MediaController(IEnumerable<IFilterService> filters) 
    { 
     this.filters = filters; 
    } 

    public async Task<HttpResponseMessage> FilterAsync(FilterType type, Name entity) 
    { 
     foreach(var filter in this.filters.Where(x => x.CanHandle(type))) 
     { 
      filter.FilterAsync(entity); 
     } 
     .... 
    } 
} 

すべてが正しく動作している:唯一の問題はですUnity Dependency Injectionにインターフェイスとクラスを登録します。

container.RegisterType<IEnumerable<IFilterService>, IFilterService[] >(
       new ContainerControlledLifetimeManager()); 
container.RegisterType<IFilterService, NameService>("Name Service", 
       new ContainerControlledLifetimeManager()); 

私はこのエラーが発生します:

Error CS0305 Using the generic type 'IFilterService' requires 1 type arguments

私はそれを試してみましたが、非ジェネリックインターフェイスを持つと正常に動作したのと同じコード。

どのようにエラーを修正するには?少しの説明は非常に便利です。ありがとうございました。

答えて

2

あなたが最初に特定のフィルタタイプ

public class FilterController 
{ 
    private readonly IEnumerable<IFilterService<Name>> filters; 

    public MediaController(IEnumerable<IFilterService<Name>> filters) 
    { 
     this.filters = filters; 
    } 

    public async Task<HttpResponseMessage> FilterAsync(FilterType type, Name entity) 
    { 
     foreach(var filter in this.filters.Where(x => x.CanHandle(type))) 
     { 
      filter.FilterAsync(entity); 
     } 
     .... 
    } 
} 

二番目のオプションは、あなたのインターフェースが非ジェネリックにすることですが、あなたが機能を維持するように使用

container.RegisterType<IEnumerable<IFilterService<Name>>, IFilterService<Name>[] >(
       new ContainerControlledLifetimeManager()); 
container.RegisterType<IFilterService<Name>, NameService>("Name Service", 
       new ContainerControlledLifetimeManager()); 

を登録することで2つのオプションが、持っています総称

public interface IFilterService 
{ 
    bool CanHandle(FilterType type); 

    Task<ServiceResult<T>> FilterAsync<T>(T entity); 
} 

public class NameService : IFilterService 
{ 
    public bool CanHandle(FacetType type) 
    { 
     return type == FacetType.Name; 
    } 

    public Task<ServiceResult<T>> FilterAsync<T>(T entity) 
    { 
     if(!entity is Name) 
      throw new NotSupportedException("The parameter 'entity' is not assignable to the type 'Name'"); 

     return FilterAsyncInternal((Name)entity); 
    } 

    private async Task<ServiceResult<Name>> FilterAsyncInternal(Name entity) 
    { 
     //code 
    } 
} 
+0

2番目のソリューションで返される値は何ですか? –

+0

'タスク>'あなたの例のコントローラは、タスク 'で' T '行くから返される> 'entity'だったどんなタイプ'になります。 –

+0

私は2つの機能にしてそれを分割することによって返されるために何が起こっているか、それはもう少し明確にするために第二の例を更新しました。 –

関連する問題