2009-07-01 19 views
1

目前的ASP.Net的东西,我用其中每个请求(仅在需要时)创建一个框架,并且在端部配置的请求模型该请求。我发现这是一个很好的平衡,不需要做旧的使用每个查询模型,也没有永远的环境。现在的问题是,在WPF中,我不知道任何可以像请求模型一样使用的东西。现在看起来像它永远保持相同的上下文(这可能是一场噩梦),或回到讨厌使用每个查询模型,这是一个巨大的痛苦。我还没有看到很好的答案。实体框架:语境中WPF与ASP.Net ...如何处理

我的第一个想法是有一个打开和关闭(或任何名称)的情况下,顶级方法被称为(称为像Something_Click事件处理方法)将“打开”上下文,并在最后“关闭” 。因为我没有任何关于上下文的UI项目(所有的查询都包含在部分类的方法中,这些方法“扩展”了生成的实体类,从而在实体和UI之间有效地创建了一个伪层),这看起来像是它会使实体层依赖于UI层。

真的很茫然,因为我对状态编程不是很熟悉。

增加:

我已经使用线程上读了,但 问题,我有一个上下文只是 坐在那里是错误和恢复。

说我有一个更新的用户 信息,并有一个错误的一种形式。 用户窗体现在将在上下文 中向用户对象显示更改 ,这是很好的,因为它使得更好的 用户体验不必重新键入 所有更改。

现在,如果用户决定去 另一种形式的东西。在上下文中,这些更改仍为 。在这一点上,我坚持与上下文中的任何不正确的用户 对象 或者我得 的UI告诉上下文重置 用户。我想这是不是 可怕(用户 A级重载方法?),但我不知道这是否真的 解决问题。

回答

0

你有没有想过尝试工作的单位?我有一个类似的问题,我基本上需要能够打开和关闭一个上下文而不会暴露我的EF上下文。我认为我们正在使用不同的体系结构(我使用的是IoC容器和存储库层),所以我必须稍微剪切一下这些代码以向您展示。我希望它有帮助。

首先,当它涉及到的是“Something_Click”的方法,我想有一个看起来是这样的代码:

using (var unitOfWork = container.Resolve<IUnitOfWork>){ 

    // do a bunch of stuff to multiple repositories, 
    // all which will share the same context from the unit of work 

    if (isError == false)  
     unitOfWork.Commit(); 
} 

在我的每个库的,我得检查一下,如果我是在一个工作单位。如果我是,我会使用工作单位的背景。如果没有,我不得不实例化我自己的上下文。因此,在每个存储库中,我都会看到如下代码:

if (UnitOfWork.Current != null) 
{ 
    return UnitOfWork.Current.ObjectContext; 
} 
else 
{ 
    return container.Resolve<Entities>(); 
} 

那么UnitOfWork呢?那里不多。我不得不削减一些评论和代码,所以不要把这个课程当作完全工作,但是......这里你去:

public class UnitOfWork : IUnitOfWork 
{ 
    private static LocalDataStoreSlot slot = Thread.AllocateNamedDataSlot("UnitOfWork"); 
    private Entities entities; 

    public UnitOfWork(Entities entities) 
    { 
     this.entities = entities; 
     Thread.SetData(slot, this); 
    } 

    public Entities ObjectContext 
    { 
     get 
     { 
      return this.Entities; 
     } 
    } 

    public static IUnitOfWork Current 
    { 
     get { return (UnitOfWork)Thread.GetData(slot); } 
    } 

    public void Commit() 
    { 
     this.Entities.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     entities.Dispose(); 
     Thread.SetData(slot, null); 
    } 
} 

这可能需要一些工作,以分解到您的解决方案,但这可能是一个选项。