- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与大多数人一样,我已经掌握了 Entity Framework 的某些来龙去脉。其中之一就是上下文的生命周期。我正在使用一个存储库,并决定上下文将在请求的长度内存在。因此,无论在何处使用该存储库,都需要从 Web 层注入(inject)上下文。
我已经写了一些我确信可以重构的代码(事实上,绝对可以!)。那么基于上述概念,您将如何优化以下存储库助手?
public class RepositoryHelper
{
public static CountryRepository GetCountryRepository() {
return new CountryRepository(HttpContext.Current.GetObjectContext());
}
public static CurrencyRepository GetCurrencyRepository()
{
return new CurrencyRepository(HttpContext.Current.GetObjectContext());
}
public static SettingRepository GetSettingRepository()
{
return new SettingRepository(HttpContext.Current.GetObjectContext());
}
}
存储库非常简单,看起来像
public class CountryRepository
{
private Context _context = null;
public CountryRepository(Context context)
{
_context = context;
}
public Country GetById(int id)
{
// Would return a country
}
public IEnumerable<Country> All()
{
// Would return a list of countries
}
}
最佳答案
这里的挑战是您构建的不是存储库模式意义上的存储库。存储库模式的一个目标是从问题域中抽象出数据访问层的实现。它是通过一个存储库完成的,该存储库的行为类似于域对象的内存中集合,您可以使用它执行正常的 CRUD 功能,通常还可以执行一些更具体的操作,即 GetByID(id)。
存储库随后对应用程序隐藏了实际的持久层,实际上允许您在不影响应用程序的情况下更改该层,即您可以先将数据存储在平面文件中,然后再转移到 RDBMS。
您通常会创建一个接口(interface)来描述您的存储库需要实现的方法,并使用该接口(interface)作为类型实际传递存储库实例。这是抽象,该接口(interface)在存储库的所有可能具体实现中都是通用的,但您的应用程序(在某种程度上)忽略了实际使用的接口(interface)。
我建议退后一步,再次查看存储库模式,看看您是否需要它。确保您不只是为了它而实现它,并且您没有不必要地增加应用程序的复杂性。一旦您确定了数据访问方法,您就可以了解如何最好地利用您拥有的 EF 上下文。
关于c# - 重构时机成熟——.NET 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6292132/
我是一名优秀的程序员,十分优秀!