Внедрение зависимостей и пользовательские данные - PullRequest
2 голосов
/ 25 июня 2011

У меня есть приложение, которое использует ORM (Nhibernate, но это не так).

Чтобы создать NH-сессию, нам нужно куда-то передать: имя пользователя, имя базы данных и т. Д. Итак, я реализовал:

public interface ISettingsManager
{
    Settings MySettings {get;set;}
}

public class Settings
{
    public string DbUser{get;set;}
    public string DbAddress {get;set;}
    public string DbPassword{get;set;}
    //...
}

public class SessionProvider
{
    [Inject]
    public ISettingsManager MySettings {get;set;}

    public Session CreateSession
    {
        //Create Session object using settings passed do MySettings via IoC.
    }
}

public static Main()
{
    // very beggining of my application, bootstrap the DI container
    Bind<ISettingsManager>().To<SettingsManagerImpl>();
    // Application run
}

У всех моих провайдеров NHibernate-сессии есть ISettingsManager.через DI (Ninject), поэтому я могу просто использовать его.Это работает как вред, но теперь мне нужно поддержать многих пользователей в моем приложении, и проблема уходит на сцену.Я не могу связать свой ISettingsManager при запуске приложений, потому что я не знаю, когда пользователь войдет в систему.

Итак, вопрос в том, как наилучшим образом реализовать передачу параметров текущего зарегистрированного пользователя, не используя Service Location?

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Я бы использовал отдельную БД для всех аутентификаций, а затем извлекал бы пользовательские настройки БД из этой БД.

Используя извлеченные пользовательские настройки, я бы создал класс, который вы хотите внедрить в процесс подключения вашего ORM, и внедрил его, используя конструктор или внедрение свойства.

1 голос
/ 25 июня 2011

Если я правильно понял проблему, может помочь что-то вроде шаблона синглтона (см. http://en.wikipedia.org/wiki/Singleton_pattern).

Один синглтон будет хранить информацию и предоставлять ее по запросу. Другие компоненты должны знать только, как получить доступ к синглтону, а не что-то более конкретное.

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

...