第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實體框架4 CTP 4 / CTP 5通用存儲庫模式和單元可測試

實體框架4 CTP 4 / CTP 5通用存儲庫模式和單元可測試

慕容3067478 2019-08-26 10:15:57
實體框架4 CTP 4 / CTP 5通用存儲庫模式和單元可測試我正在玩最新的Entity Framework CTP 5版本并構建一個簡單的asp.net MVC博客,其中我只有兩個表:Post和Comments。這完全是在POCO中完成的,我只需要DbContext部分的幫助,我需要它可以進行單元測試(使用IDbSet?),我需要一個簡單/通用的存儲庫模式來添加,更新,刪除,檢索。任何幫助表示贊賞。
查看完整描述

3 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

從DbContext開始,創(chuàng)建一個名為Database.cs的新文件:

Database.cs

public class Database : DbContext
    {
        private IDbSet<Post> _posts;
        public IDbSet<Post> Posts {
            get { return _posts ?? (_posts = DbSet<Post>()); }
        }
        public virtual IDbSet<T> DbSet<T>() where T : class {
            return Set<T>();
        }
        public virtual void Commit() {
            base.SaveChanges();
        }}

定義IDatabaseFactory并使用DatabaseFactory實現(xiàn)它:

IDatabaseFactory.cs

public interface IDatabaseFactory : IDisposable
    {
        Database Get();
    }

DatabaseFactory.cs

public class DatabaseFactory : Disposable, IDatabaseFactory {
        private Database _database;
        public Database Get() {
            return _database ?? (_database = new Database());
        }
        protected override void DisposeCore() {
            if (_database != null)
                _database.Dispose();
        }
    }

一次性擴展方法:

Disposable.cs

public class Disposable : IDisposable
    {
        private bool isDisposed;
        ~Disposable()
        {
            Dispose(false);
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if(!isDisposed && disposing)
            {
                DisposeCore();
            }
            isDisposed = true;
        }
        protected virtual void DisposeCore()
        {
        }
    }

現(xiàn)在我們可以定義我們的IRepository和RepositoryBase

IRepository.cs

public interface IRepository<T> where T : class{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    T GetById(long Id);
    IEnumerable<T> All();
    IEnumerable<T> AllReadOnly();}

RepositoryBase.cs

public abstract class RepositoryBase<T> where T : class
    {
        private Database _database;
        private readonly IDbSet<T> _dbset;
        protected RepositoryBase(IDatabaseFactory databaseFactory)
        {
            DatabaseFactory = databaseFactory;
            _dbset = Database.Set<T>();
        }
        protected IDatabaseFactory DatabaseFactory
        {
            get; private set;
        }
        protected Database Database
        {
            get { return _database ?? (_database = DatabaseFactory.Get()); }
        }
        public virtual void Add(T entity)
        {
            _dbset.Add(entity);
        }
        public virtual void Delete(T entity)
        {
            _dbset.Remove(entity);
        }
        public virtual void Update(T entity)
        {
            _database.Entry(entity).State = EntityState.Modified;
        }
        public virtual T GetById(long id)
        {
            return _dbset.Find(id);
        }
        public virtual IEnumerable<T> All()
        {
            return _dbset.ToList();
        }
        public virtual IEnumerable<T> AllReadOnly()
        {
            return _dbset.AsNoTracking().ToList();
        }
    }

現(xiàn)在您可以創(chuàng)建IPostRepository和PostRepository:

IPostRepository.cs

     public interface IPostRepository : IRepository<Post>
        {
            //Add custom methods here if needed
            Post ByTitle(string title);
        }

PostRepository.cs

    public class PostRepository : RepositoryBase<Post>, IPostRepository
        {
            public PostRepository(IDatabaseFactory databaseFactory) : base(databaseFactory)
            {
            }
            public Post ByTitle(string title) {
                return base.Database.Posts.Single(x => x.Title == title);
            }
        }

最后,UoW:

IUnitOfWork.cs

public interface IUnitOfWork{
    void Commit();}

UnitOfWork.cs

private readonly IDatabaseFactory _databaseFactory;private Database _database;public UnitOfWork(IDatabaseFactory databaseFactory){
    _databaseFactory = databaseFactory;}protected Database Database{
    get { return _database ?? (_database = _databaseFactory.Get()); }}public void Commit(){
    Database.Commit();}

在您的控制器中使用:

private readonly IPostRepository _postRepository;private readonly IUnitOfWork_unitOfWork;
        public PostController(IPostRepository postRepository, IUnitOfWork unitOfWork)
        {
            _postRepository = postRepository;
            _unitOfWork = unitOfWork;
        }
        public ActionResult Add(Post post) {
            _postRepository.Add(post);
            _unitOfWork.Commit();
        }

您需要使用像StructureMap這樣的IoC容器來完成這項工作。您可以通過NuGet安裝結構圖,或者如果您使用的是MVC 3,則可以安裝StructureMap-MVC NuGet包。(以下鏈接)

安裝包StructureMap.MVC4

Install-Package StructureMap.MVC3

安裝包結構圖

如果您有任何疑問,請告訴我。希望能幫助到你。


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 454 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號