2010-04-23 43 views
1

我们的应用程序中有许多实例,希望能够访问我们的业务域和数据访问层中当前登录的用户标识等内容。在日志中,我们将这些信息推送到会话中,所以当然我们所有的前端代码都可以很容易地访问它。但是,我们在应用程序的较低层获取数据时遇到了大量问题。我们似乎无法找到一种方法将价值存储在仅为用户设置全局范围的业务域中(静态类和属性当然由应用程序域共享,这意味着会话中的所有用户只共享一个对象的副本)。我们考虑将会话传递给我们的业务类,但是我们的域与我们的Web应用程序紧密耦合。我们希望继续保持应用程序的Winforms版本的前景。如何从Web应用程序层下的图层访问会话值

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

回答

3

我不认为让您的业务类依赖全局对象是一个伟大的想法,并会尽可能避免它。你需要注入必要的信息 - 这使得它们更具可测试性和可扩展性。

因此,不要将Session对象直接传递给它们,而应该将需要的信息访问方法合并到存储库类中。您的业​​务层可以使用存储库类作为数据源(例如,对其调用GetUser()),并且您的Web应用程序存储库可以使用会话来检索请求的信息(返回_session.User.Identity)。当将它移植到winforms时,只需使用一个新的以winform为中心的类实现存储库接口(即GetUser()返回用户主体的windows版本)。

0

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

如果你想做一个中途作弊(但不是太多的作弊),你可以做的是创建一个非常小的程序集,只需要几个POCO classes来存储你想要分享的所有信息所有级别(当前已登录的用户名,登录时间等),并将该对象从您的前端传递到您的biz /数据层。现在,如果你这样做,你必须避免把这个POCO程序集变成一个通用工具程序集的诱惑 - 它必须保持很小,否则你将在未来遇到问题(相信我或者学习困难的方式或者请别人来详细说明这个问题)一)。然而,如果你有这个POCO程序集,通过各种层次注入这些数据变得非常容易,而且它是POCO,它序列化非常好,并且与Web服务,WCF等很好地配合。

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; 

此接口可从我们的代码几乎任何地方。

然后我们有两个会话和/或一个单独实施

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; } 
} 

}

在INITING的应用程序,网站将做在Global.asax中一个

Framework.Storage.SessionStorage = new WebSessionStorage(); 

,和FormsApp将做

Framework.Storage.SessionStorage = new WebFormsSessionStorage(); 
相关问题