2

Googleで何も見つからず、約30分間集中的に検索した後、直接尋ねることにしたので、私がやりたいことが可能かどうかわかりません.

リポジトリ用のシンプルなインターフェースを定義しました

public interface IRepository<TEntity> : IDisposable
{
    TEntity GetById(object id);
    List<TEntity> GetAll();
}

今、最初のリポジトリを実装したいのですが、このように機能します

public class ContentRepository : IRepository<ContentPages>
{
    private readonly Context _db = new Context();

    public ContentPages GetById(object id)
    {
        var result = _db.ContentPages.Find(id);
        return result;
    }

    public List<ContentPages> GetAll()
    {
        return _db.ContentPages.ToList();
    }

    public void Dispose()
    {
        _db.Dispose();
    }
}

これは正常に機能しますが、リポジトリを mvc コントローラーに挿入すると、IRepository<ContentPages>as パラメーター型が必要になり、IRepository.

このようにジェネリック型を関数自体に移動しようとしました

public interface IRepository : IDisposable
    {
        TEntity GetById<TEntity>(object id);
        List<TEntity> GetAll<TEntity>();
    }
}

TEntityこれを行うと、実装でジェネリック型を定義する方法がわかりません

結論として、タイプを指定せずにインターフェイスを使用して、このように実際のオブジェクトからタイプを取得する必要があります

public constructor1(IRepository ContentRepository){}

次のコントローラーはこのコンストラクターを取得します

public constructor2(IRepository BlogRepository){}

等々

皆さんが理解できるように、私の問題を十分に詳しく説明できれば幸いです:)

4

2 に答える 2

0

Classの具体的な実装内IRepositoryで、TEntity の型を次のように定義できます。

  public TEntity GetById<TEntity>(object id) where TEntity:class
   {
    // Implimetation
   }

ただし、ここでは、リポジトリのパターンに従って、次のように使用することをお勧めします。

public interface IRepository<TEntity>: IDisposable where TEntity : class 
于 2013-11-09T19:22:38.327 に答える
0

そのような変種を試してください:

public interface IRepository<TEntity> where TEntity : class
{
    TEntity Find(params object[] keyValues);

    // ...
}

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    private readonly IDbSet<TEntity> _dbSet;

    public Repository(IDbContext context)
    {
        _dbSet = context.Set<TEntity>();
    }

    public virtual TEntity Find(params object[] keyValues)
    {
        return _dbSet.Find(keyValues);
    }

    // ...
}

使用例:

IRepository<ApplicationUser> repository = new Repository<ApplicationUser>(new ApplicationDbContext());
ApplicationUser applicationUser = repository.Find("key");

また、より良い解決策があります - パターン UnitOfWork を使用できます。codeplex でこの実装を確認してください。本当にかっこいいです。

例:

public class DatabasesController : Controller
{
    private UnitOfWork _unitOfWork;
    private WebContext _context;

    public DatabasesController()
    {
        _context = new WebContext();
        _unitOfWork = new UnitOfWork(_context);
    }

    //
    // GET: /Databases/

    public ViewResult Index()
    {
        List<Database> databases =
            _unitOfWork
            .Repository<Database>()
            .Query()
            .Include(database => database.FileEntitiesInfo)
            .Get()
            .ToList();
        _unitOfWork.Save();
        return View(databases);
    }
}
于 2013-11-09T22:59:20.363 に答える