短いです:
派生型をコレクションに追加すると成功するのに、派生型のジェネリックを追加しようとすると失敗するのはなぜですか?
「短い」コード:
//a generic repository
public class EfRepository<T> : IRepository<T> where T: BaseCatalogModel{...}
public CatalogRepository(IRepository<Product> productRepository, IRepository<Category> categoryRepository)
{
//This passes
Dictionary<int, BaseCatalogModel> dic1 = new Dictionary<int, BaseCatalogModel>();
dic1.Add(1, new Product());
dic1.Add(2, new Category());
dic1.Add(3, new BaseCatalogModel());
//This not.
//The error: cannot convert from 'YoYo.Core.Data.Repositories.EfRepository<YoYo.Commerce.Common.Domain.Catalog.Product>'
//to 'YoYo.Core.Data.Repositories.EfRepository<YoYo.Commerce.Common.Domain.Catalog.BaseCatalogModel>'
Dictionary<int, EfRepository<BaseCatalogModel>> dic2 = new Dictionary<int, EfRepository<BaseCatalogModel>>();
dic2.Add(1, new EfRepository<Product>());
dic2.Add(2, new EfRepository<Category>());
}
長い取引: オンラインストアで作業しているため、カタログ管理に関連するすべてのリポジトリのコレクションをカタログリポジトリに保持したいと考えています。
アイデアは、1 つのリポジトリからカタログ全体を管理することです。
リポジトリ コレクションのタイプは Dictionary です)
BaseCatalogModel 派生型リポジトリをコレクションに追加できません。
上記に関する支援や、より良い実装のための提案をいただければ幸いです。
public class BaseCatalogModel
{
public int Id { get; set; }
...
}
public class Category:BaseCatalogModel
{
...
}
public class Product : BaseCatalogModel
{
...
}
public class CatalogRepository : ICatalogRepository
{
private readonly Dictionary<Type, IRepository<BaseEntity>> _repositoriesCollection= new Dictionary<Type, IRepository<BaseEntity>>();
public CatalogRepository(IRepository<Product> productRepository, IRepository<Category> categoryRepository)
{
_repositoriesCollection.Add(typeof(Category), categoryRepository); //==> this fails
_repositoriesCollection.Add(typeof(Product), productRepository); //==> this fails
}
public T GetCatalogItem<T>(int id) where T : BaseCatalogModel
{
//returns a catalog item using type and id
}
public IEnumerable<T> GetCatalogItem<T>() where T : BaseCatalogModel
{
//returns the entire collection of catalog item
}
}