0

我在这里有我的应用程序,实际上每个对象都有一个 lastUpdatedBy 属性。我在这里输入的信息是这个人的用户名,它是从 session("username") 变量中检索的。

如何将此数据传递给类库中的 DAL?

起初我只是将值传递给每个方法,但我认为这很荒谬,每次调用方法时都没有理由这样做。

然后我想如果我只是把它放在每个 DAL 相关类的构造函数中,那会更容易。

然而,即使在任何给定的页面上,我也有大量的 New() 声明,我需要在会话用户名中传递的每一行都转换为字符串。

有没有一种更有效的方法来做到这一点,这样我只能在一个地方声明它,一切都会知道它是什么,我可以将它传递给类库中的类?

4

3 回答 3

1

有几种方法可以解决它。

一个是有一个类,它为您从会话中检索值。与 Session.Current.Username 一样,Current 是返回会话实例的静态属性,而 Username 是 Session 的简单属性。

另一种是使用依赖注入。您仍然可以在构造函数中输入输入(最好是一个类而不是简单值),但您不需要在代码中显式传递它,因为它是自动注入的。

于 2010-05-06T17:17:00.693 回答
0

我通常会采取措施确保Thread.CurrentPrincipal引用当前连接的用户。在某些情况下,这将自动完成:

  • 使用 ASP.NET RoleManager 的 ASP.NET 应用程序

  • 使用 principalPermissionMode ="UseAspNetRoles" 托管在 IIS 中的 WCF 服务

在其他情况下,您可能必须自己做(例如在 WinForms 应用程序中的应用程序启动时)。

然后您的 DAL 可以简单地用于Thread.CurrentPrincipal.Identity.Name识别当前用户。

这比 using 更干净HttpSessionState,这意味着依赖于 ASP.NET。

于 2010-05-06T18:35:09.713 回答
-1

我会创建一个AbstractDALObject包含string Username属性的抽象类。使您的所有 DAL 类都派生自这个抽象类,并通过创建一个DALFactory设置该属性的类来实例化它们。您的DALFactory类将包含CreateXXXDAL每种 DAL 类型的方法,或者您可以使用反射创建一个通用方法,如下所示:

    private HttpSessionState m_Session = null; //set in constructor

    T CreateDAL<T>() where T : AbstractDALObject {
        Type t = typeof(T);

        //fetch a zero-param constructor 
        //you could change the argument types if you have a 
        //standard for the class
        ConstructorInfo ctor = t.GetConstructor(new Type[0]);

        T myDAL = (T) ctor.Invoke(new object[0]);
        myDAL.Username = m_Session ("Username");

        return myDAL;
    }
于 2010-05-06T17:29:56.997 回答