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

不知何故,这感觉是错误的和有缺陷的,另一方面,仅仅在派生上下文中实例化每个存储库也感觉不太好,因为实例化的对象可能根本不需要。

关于如何使这个设计听起来有什么建议吗?我应该这样吗?当我这样做的时候,有什么我应该添加或避免的吗?

建立EF应用程序的结构

我不明白这部分:

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等容器。