2017-10-31 16 views
1

私は変更できない外部サービスを持っていますが、機能の範囲で新しいクラスライブラリを追加することしかできません。私の問題は、私のクラスライブラリがEF->リポジトリ - >サービスとIOCコンテナを使用していて、ライブラリに外部サービスを接続すると、このサービスは接続文字列が定義されていないため動作しません。DbContextへの接続文字列の挿入

internal class ServiceLocator 
{ 
    static ServiceLocator() 
    { 
     Current = new DefaultServiceLocator(); 
    } 

    public static IServiceLocator Current { get; } 

    private sealed class DefaultServiceLocator : IServiceLocator 
    { 
     private readonly IKernel _kernel; // Ninject kernel 

     public DefaultServiceLocator() 
     { 
      _kernel = new StandardKernel(); 
      LoadBindings(); 
     } 

     public T Get<T>() 
     { 
      return _kernel.Get<T>(); 
     } 

     private void LoadBindings() 
     { 

      string name = ""; // connection string 
      _kernel.Bind<DbContext>().ToConstructor(_ => new Entities(name)); 
      _kernel.Bind<IRegionService>().To<RegionService>(); 
      _kernel.Bind<IRegionRepository>().To<RegionRepository>(); 
      _kernel.Bind<IMapper>().ToConstant(AutoMapperConfig.Initialize()); 
     } 
    } 
} 

私はコンストラクタに接続文字列を渡すために自分自身の部分クラスを作成しました::自動生成など

public partial class Entities 
{ 
    public Entities(string name) 
     :base(name) 
    { 
    } 
} 

を私は私のクラスライブラリにIOCのコンテナを実装定義するために、ユーザーサービスロケータを得ることを見出しクラスには、接続文字列を渡すことはできません(と私はこれを変更する必要はありません):

public partial class Entities : DbContext 
{ 
    public Entities() 
    : base("name=Entities") 
    { 
    } 
} 

私はそれが自動生成DbContextを指していることがわかり、私はデバッグモードで私のテストアプリケーションを実行します私が作ったクラスです。前に述べたように、App.configファイルに接続文字列を追加するだけで外部サービスを変更することはできません。親切にも私の問題に可能な解決策を教えてください。私は変更を設計するために開いています。

+0

私はこのことを理解していない:「私はデバッグモードで私のテストアプリケーションを実行すると、私はそれがで作成されたこれに代わり、自動生成DbContextクラスを指していることがわかり私。 "あなたが別のクラスの部分クラスを追加するとき、それは同じクラスですが、より多くのファイルで定義される可能性があります。その結果、ソリューションにはただ1つのクラスだけが必要です。あるいは、別の名前空間やアセンブリで部分クラスを作成しましたか? –

+0

@JanMuncinsky私のクラスライブラリは公開エンティティ(文字列名)をインスタンス化します:パブリックEntities():base( "name = Entities")ではなくbase(name)。 2番目のケースでは、テストアプリケーションはApp.configファイル内のEntities接続文字列を検索しようとします。私がしたいのは、私のクラスライブラリ内の接続文字列をハードコードし、エンティティ(文字列名):base(name)を呼び出すことです。私は何を達成したいのかを説明していますか? – ironcurtain

答えて

1

あなたのクラスの中にはDbContextではなくEntitiesの依存関係があると思われます。この場合、Ninjectは暗黙の自己バインディングにフォールバックする傾向があり、解決できる依存関係を持つコンストラクタを選択します(この場合はデフォルト)。

これは代わりに結合してみてください。

_kernel.Bind<Entities>().ToConstructor(_ => new Entities(name));

+1

ありがとうございます。それが私の問題を解決しました。 – ironcurtain

関連する問題