所以我遇到了一些障碍,虽然很小。我想我的漏洞抽象类似于下面的答案:
我正在使用抽象工厂模式来创建存储库的工厂。这使我能够保持DBContext的轻量级,并且仍然允许我在调用SaveChanges()
之前调用存储库中的多个方法。这样做的好处是我可以在保存之前批量处理多个命令。
using System.Collections.Generic;
namespace RouteMiningBLL
{
public class ZIPCodeInfoService
{
private readonly IRouteMiningRepositoryFactory factoryRepository;
public ZIPCodeInfoService(IRouteMiningRepositoryFactory factoryRepository)
{
this.factoryRepository = factoryRepository;
}
public IList<ZIPCodeInfo> GetAllZIPCodeInfo(int zipcode, int radius)
{
using (IZIPCodeInfoRepository repo = factoryRepository.CreateZIPCodeInfoRepository())
{
List<ZIPCodeInfo> zipCodeInfos = new List<ZIPCodeInfo>();
// Get all zipcodes within radius of zipcode from site
ZIPCodePage page = new ZIPCodePage();
IEnumerable<int> zipCodes = page.GetZIPCodes(zipcode, radius);
foreach (int foundZipcode in zipCodes)
{
zipCodeInfos.Add(GetZIPCodeInfo(foundZipcode));
}
repo.SaveChanges();
return zipCodeInfos;
}
}
}
}
上面是我当前的实现,但它需要IRouteMiningRepositoryFactory来实现IDisposable
,这显然是一个泄漏抽象。我想弄清楚的是如何处理这个问题?
在此之前,我刚刚在工厂内处理了DBContext。但是,这需要我使用每个Repository方法调用创建一个新的DBContext(根本不是一个大问题),但这会强迫我在每个存储库方法的末尾调用dbContext.SaveChanges()
(因此,不要让我批处理工作)。我坚持如何处理Leaky抽象与批处理。
在任何一种情况下,我都会有一个漏洞抽象,因为需要处理DBContext。它只会改变发生的位置(BLL vs DAL)。谢谢!