建立EF应用程序的结构
本文关键字:结构 应用程序 EF 建立 | 更新日期: 2023-09-27 18:04:39
我正在使用poco开发EF应用程序的原型。主要是作为框架的介绍,我想知道一个好的方法来建立一个良好的结构的应用程序。以后我打算把WCF合并进去。
我所做的是:
1)我创建了一个edmx文件,但是将代码生成属性设置为None并生成了我的数据库模式,
2)我创建了poco,它们看起来像:
public class Person
{
public Person()
{
}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
3)我创建了一个Context
public class PocoContext : ObjectContext, IPocoContext
{
private IObjectSet<Person> persons;
public PocoContext() : base("name=PocoContainer", "PocoContainer")
{
ContextOptions.LazyLoadingEnabled = true;
persons= CreateObjectSet<Person>();
}
public IObjectSet<Person> Persons
{
get
{
return persons;
}
}
public int Save()
{
return base.SaveChanges();
}
}
界面是这样的:
public interface IPocoContext
{
IObjectSet<Person> Persons { get; }
int Save();
}
最后,我创建了一个存储库,实现了一个接口:
public class PersonRepository : IEntityRepository<Person>
{
private IPocoContext context;
public PersonRepository()
{
context = new PocoContext();
}
public PersonRepository(IPocoContext context)
{
this.context = context;
}
// other methods from IEntityRepository<T>
}
public interface IEntityRepository<T>
{
void Add(T entity);
List<T> GetAll();
T GetById(int id);
void Delete(T entity);
}
现在,当我开始摆弄这个时,这种设计要求我每次想要获取或更改一些数据时实例化一个存储库,像这样:
using (var context = new PocoContext())
{
PersonRepository prep = new PersonRepository();
List<Person> pers = prep.GetAll();
}
不知何故,这感觉是错误的和有缺陷的,另一方面,仅仅在派生上下文中实例化每个存储库也感觉不太好,因为实例化的对象可能根本不需要。
关于如何使这个设计听起来有什么建议吗?我应该这样吗?当我这样做的时候,有什么我应该添加或避免的吗?
我不明白这部分:
using (var context = new PocoContext())
{
PersonRepository prep = new PersonRepository();
List<Person> pers = prep.GetAll();
}
如果您调用存储库构造函数而不将上下文作为参数传递,为什么要在外部作用域中创建上下文?使用多个上下文只会让事情变得更加困难。另外,如果您的外部块只是创建类的实例,那么为存储库制作接口并试图隐藏它的意义是什么?
你的方法正确吗?通常是的。您应该为逻辑操作(工作单元)使用单个上下文,如果您的存储库通过构造函数获得上下文,则需要为每个上下文创建一组新的存储库。这通常通过依赖注入实现。
只是在派生上下文中实例化每个存储库并不能感觉也太好了,因为潜在的实例化对象I可能根本不需要。
这个问题很容易通过延迟初始化来解决:
private SomeRepositoryType _someRepository
public SomeRepositoryType SomeRepository
{
get { _someRepository ?? (_someRepository = new SomeRepositoryType(context)) }
}
但我不会把它放在上下文中。我可能会在一些数据访问工厂中使用它,因为它应该在上下文之外,并且使用多个存储库将单个工厂作为注入传递给类/方法更简单。
顺便说一句。您将从使用存储库中获得什么价值?
如果你使用POCO来创建你的数据库模型,不妨先试试EF Code ?我认为使用Code First比在设计器中创建EDMX模型更清晰。
通过为每个请求提供对象上下文来使用依赖注入,如Castle Windsor, AutoFac等容器。