我一直在尋找一些博客帖子,試圖創建一個適合以下要求的解決方案,但我似乎無法將它們拼湊在一起。希望完全有人可以幫忙。MVC倉庫與工作單元,自動映射器和通用倉庫
我一直在使用使用Automapper接口庫模式......這裏有一個下調例如:
public class BookingRepository : IBookingRepository
{
Entities context = new Entities();
public IEnumerable<BookingDto> GetBookings
{
get { return Mapper.Map<IQueryable<Booking>, IEnumerable<BookingDto>>(context.Bookings); }
}
public BookingDto GetBookingWithProduct(Guid bookingId)
{
return Mapper.Map<BookingDto>(context.Bookings.Include(c => c.Products).SingleOrDefault(c => c.BookingId == bookingId));
}
public void Update(BookingDto bookingDto)
{
var booking = Mapper.Map<Booking>(bookingDto);
context.Entry(booking).State = EntityState.Modified;
}
public void Save()
{
context.SaveChanges();
}
public void Dispose()
{
context.Dispose();
}
}
public interface IBookingRepository : IDisposable
{
IEnumerable<BookingDto> GetBookings { get; }
BookingDto GetBooking(Guid bookingId);
void Update(BookingDto bookingDto);
void Save();
}
隨着不同的實體一個單獨的存儲庫,例如
public class ProductRepository : IProductRepository
{
Entities context = new Entities();
public IEnumerable<ProductDto> GetProducts
{
get { return Mapper.Map<IQueryable<Product>, IEnumerable<ProductDto>>(context.Products); }
}
public ProductDto GetProductWithDesign(int productId)
{
return Mapper.Map<ProductDto>(context.Products.Include(c => c.Designs).SingleOrDefault(c => c.ProductId == productId));
}
public void Update(ProductDto productDto)
{
var product = Mapper.Map<Product>(productDto);
context.Entry(product).State = EntityState.Modified;
}
public void Save()
{
context.SaveChanges();
}
public void Dispose()
{
context.Dispose();
}
}
public interface IProductRepository : IDisposable
{
IEnumerable<ProductDto> GetProducts { get; }
ProductDto GetProduct(int productId);
void Update(ProductDto productDto);
void Save();
}
然後在我的控制器中,我使用的庫如下:
public class HomeController : Controller
{
private readonly IBookingRepository bookingRepository;
private readonly IProductRepository productRepository;
public HomeController() : this(new BookingRepository(), new ProductRepository()) { }
public HomeController(IBookingRepository bookingRepository, IProductRepository productRepository)
{
this.bookingRepository = bookingRepository;
this.productRepository = productRepository;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing && this.bookingRepository != null)
this.bookingRepository.Dispose();
if (disposing && this.productRepository != null)
this.productRepository.Dispose();
}
}
因此,現在我希望創建一個工作單元來抽象這些存儲庫並共享上下文,併爲重複操作(保存和更新)創建一個通用存儲庫,同時記住我正在傳遞Dtos和映射到實體對象。我很難理解如何將它們結合在一起。
此外,我已經看到了這個帖子
Repository pattern with generics and DI
其中指出:「你不應該有除了你的通用倉庫等庫接口」和自定義查詢「應該擁有自己的(通用)抽象:」這是增加了我的勞累過度的大腦的另一個複雜因素,因爲我的存儲庫將具有使用包含語句返回複雜鏈接對象的自定義查詢,因爲禁用了「延遲加載」。
所以我準備好被擊落,並告訴我這是錯誤的方式,但會感謝任何方向。
在此先感謝。
我覺得你的文章很有趣,但看起來你實際上正在展示如何創建一個通用庫。 – reddy 2014-06-04 06:52:58
@Joey:重要的區別是我不直接使用它,而是繼承它。 – jgauffin 2014-06-04 07:47:47
這很有道理,謝謝 – reddy 2014-06-04 07:50:33