gpt4 book ai didi

asp.net-mvc - 具有工作单元、自动映射器和通用存储库的 MVC 存储库

转载 作者:行者123 更新时间:2023-12-01 11:44:45 26 4
gpt4 key购买 nike

我一直在查看一些博客文章,试图为以下要求创建一个合适的解决方案,但我似乎无法将它们拼凑在一起。完全希望有人能提供帮助。

我一直在使用 Repository 模式和使用 Automapper 的接口(interface)......这是一个精简的例子:

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();
}

然后在我的 Controller 中我这样使用存储库:

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

其中指出“除了通用存储库之外,您不应该有其他存储库接口(interface)”,并且自定义查询“应该有自己的(通用)抽象:”这给我过度劳累的大脑增加了另一个复杂性,因为我的存储库将具有返回的自定义查询使用包含语句作为延迟加载的复杂链接对象被禁用。

所以我准备好被击落并被告知我正在以错误的方式进行此操作,但我将不胜感激任何给出的方向。

提前致谢。

最佳答案

不要使用通用存储库。它们都是有漏洞的抽象。问问自己,使用不真正抽象掉某些东西的抽象对您有什么好处?在这些情况下,您可以直接使用您的 OR/M。

我的意思是任何暴露IQueryable<T>的东西迫使用户了解底层 OR/M 的弱点。示例:orm 是如何处理延迟加载的?我如何急切加载相关实体?如何创建 IN条款?

如果您真的想使用存储库模式,要么将它与规范模式一起使用(您可以继续使用通用存储库),要么创建特定于每个根聚合的存储库。

我在博客上写过:http://blog.gauffin.org/2013/01/repository-pattern-done-right/

关于asp.net-mvc - 具有工作单元、自动映射器和通用存储库的 MVC 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com