2

私はORM(Nhibernateを使用しますが、そうではありません)を使用するアプリケーションを持っています。など、ユーザ名、データベース名を、だから私は実装しています:依存性注入とユーザー固有のデータ

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のセッションプロバイダはそうDI(Ninject)を経由して、それにISettingsManagerを注入してきた私たちはどこかに合格する必要がNHセッションを作成する

私はそれを簡単に使うことができます。それは害のように機能しますが、今では私のアプリケーションで多くのユーザーをサポートする必要があり、問題はシーンに入ります。

サービスの場所を使わずに、現在のログに記録されているユーザー設定を最良の方法で渡す方法を問われていますか?いいえ、問題はありません。

+1

名前の暴力的なソースにもかかわらず、あなたは魅力的で、害のないように思っています。 –

答えて

1

私が問題を正しく理解したと仮定すると、シングルトンパターンのようなものが役に立ちます(http://en.wikipedia.org/wiki/Singleton_pattern参照)。

シングルトンは情報を格納し、要求されたときにそれを与えるでしょう。他のコンポーネントは、より具体的なものではなく、シングルトンにアクセスする方法だけを知る必要があります。

シングルトンから個々のユーザー設定を取得するために、キー(ユーザーIDなど)を値にマップする辞書型のデータ構造が適しています。

+0

シングルトンと一緒にプレイした後、サービスロケーションが紹介されますが、それは解決策です。 – Dariusz

1

すべての認証に個別のDBを使用し、そのDBからユーザー固有のDB設定を引き出します。

検索したユーザー固有の設定を使用して、ORMの接続プロセスに注入するクラスを作成し、コンストラクタまたはプロパティ注入を使用して注入します。