1

我们的应用程序中有许多实例,我们希望能够访问我们业务域和数据访问层中当前登录的用户 ID 等内容。在日志中,我们将此信息推送到会话,因此我们所有的前端代码当然都可以轻松访问它。但是,我们在获取应用程序较低层的数据时遇到了巨大的问题。我们似乎无法找到一种方法来将值存储在仅为用户具有全局范围的业务域中(静态类和属性当然由应用程序域共享,这意味着会话中的所有用户只共享一个对象的副本)。我们考虑过将会话传递给我们的业务类,但是我们的域与我们的 Web 应用程序非常紧密地耦合。

我很难相信我们是第一批遇到这种问题的人。你是如何在你的应用程序中处理这个问题的?

4

3 回答 3

3

我不认为让您的业务类依赖于全局对象是一个好主意,并且如果可能的话会避免它。您应该向它们注入必要的信息——这使它们更具可测试性和可扩展性。

因此Session,您不应将对象直接传递给它们,而应将所需的信息访问方法包装到存储库类中。您的业​​务层可以使用存储库类作为数据源(GetUser()例如对其进行调用),并且您的 Web 应用程序的存储库可以使用会话来检索请求的信息(返回_session.User.Identity)。

将其移植到winforms 时,只需使用新的以winform 为中心的类实现存储库接口(即GetUser()返回用户主体的windows 版本)。

于 2010-04-23T23:06:09.873 回答
1

理论上人们会告诉你这是一种糟糕的商业行为。在实践中,我们只需要业务层中始终可用的会话级别的数据。:-(

我们最终将不同的存储引擎统一在一个小界面下。

public interface ISessionStorage 
{
   SomeSessionData Data {get;set;}
   ...
   .. and most of the data we need stored at "session" level
    }
 //and a singleton to access it
    public static ISessionStorage ISessionStorage;

这个接口几乎可以在我们代码的任何地方使用。

然后我们有一个 Session 和/或一个单例实现

 public WebSessionStorage
{
   public SomeSessionData Data 
  {
       get { return HttpContext.Current.Session["somekey"] as SomeSessionData;}
      set { HttpContext.Current.Session["somekey"] = value;}
  }

public WebFormsSessionStorage
{
   private static SomeSessionData  _SomeSessionData; //this was before automatic get;set;
   public SomeSessionData 
   {
       get{ return _SomeSessionData;}
       set{ _SomeSessionData=value; }
}

}

在启动应用程序时,该网站将执行

 Framework.Storage.SessionStorage = new WebSessionStorage(); 

在 Global.asax 中,FormsApp 会做

 Framework.Storage.SessionStorage = new WebFormsSessionStorage(); 
于 2010-04-24T00:49:25.633 回答
0

我完全同意 Womp - 将数据从您的前端向下注入您的较低层。

如果你想做一个中途作弊(但不是太多的作弊),你可以做的是创建一个非常小的程序集,只有几个POCO 类来存储你想要在你的所有文件中共享的所有这些信息层(当前登录的用户名、登录时间等),只需将此对象从您的前端传递到您的业务/数据层。现在,如果你这样做,你必须避免将这个 POCO 程序集变成一个通用实用程序程序集的诱惑——它必须保持小,否则你将来会遇到问题(相信我,或者学习困难的方法,或者请其他人详细说明这一点一)。但是,如果你有这个 POCO 程序集,通过各个层注入这些数据变得非常容易,并且由于它是 POCO,它的序列化非常好,并且可以很好地与 Web 服务、WCF 等配合使用。

于 2010-04-24T00:15:35.890 回答