Передача данных сеанса в библиотеку классов без использования группы конструкторов? - PullRequest
0 голосов
/ 06 мая 2010

У меня есть мое приложение, где буквально каждый объект имеет свойство lastUpdatedBy. Информация, которую я здесь ввожу, - это имя пользователя, которое извлекается из переменной session ("username").

Как я могу передать эти данные в мой DAL в библиотеке классов?

Сначала я просто передавал значение в каждый метод, но я подумал, что это нелепо, не должно быть никаких причин делать это каждый раз, когда вызывается метод.

Тогда я подумал, что если я просто помещу это в конструктор для каждого из классов, связанных с DAL, это сделает это еще проще.

Тем не менее, даже на любой странице у меня есть множество объявлений New (), для которых каждая строка, которую мне нужно передать в имени пользователя сеанса, приводится в виде строки.

Есть ли еще более эффективный способ сделать это так, чтобы я мог объявить это только в одном месте, и все будут знать, что это такое, и я могу передать его классам в библиотеке классов?

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Есть несколько способов сделать это.

Один из них - иметь класс, который получает значение из сессии для вас. Как и Session.Current.Username, где Current является статическим свойством, которое возвращает экземпляр сеанса, а Username - простым свойством Session.

Еще один способ - использовать внедрение зависимостей. У вас все еще есть входные данные в конструкторе (предпочтительно класс, а не простое значение), но вам не нужно явно передавать его в коде, поскольку он автоматически вводится.

0 голосов
/ 06 мая 2010

Я бы обычно делал шаги, чтобы гарантировать, что Thread.CurrentPrincipal ссылается на текущего подключенного пользователя. В некоторых случаях это будет сделано автоматически:

  • приложение ASP.NET, использующее ASP.NET RoleManager

  • служба WCF, размещенная в IIS, которая использует принципPinmissionMode = "UseAspNetRoles"

В других случаях вам может потребоваться сделать это самостоятельно (например, при запуске приложения в приложении WinForms).

Тогда ваш DAL может просто использовать Thread.CurrentPrincipal.Identity.Name для идентификации текущего пользователя.

Это чище, чем использование HttpSessionState, что подразумевает зависимость от ASP.NET.

0 голосов
/ 06 мая 2010

Я бы создал 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;
    }
...