私は変更できない外部サービスを持っていますが、機能の範囲で新しいクラスライブラリを追加することしかできません。私の問題は、私のクラスライブラリが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ファイルに接続文字列を追加するだけで外部サービスを変更することはできません。親切にも私の問題に可能な解決策を教えてください。私は変更を設計するために開いています。
私はこのことを理解していない:「私はデバッグモードで私のテストアプリケーションを実行すると、私はそれがで作成されたこれに代わり、自動生成DbContextクラスを指していることがわかり私。 "あなたが別のクラスの部分クラスを追加するとき、それは同じクラスですが、より多くのファイルで定義される可能性があります。その結果、ソリューションにはただ1つのクラスだけが必要です。あるいは、別の名前空間やアセンブリで部分クラスを作成しましたか? –
@JanMuncinsky私のクラスライブラリは公開エンティティ(文字列名)をインスタンス化します:パブリックEntities():base( "name = Entities")ではなくbase(name)。 2番目のケースでは、テストアプリケーションはApp.configファイル内のEntities接続文字列を検索しようとします。私がしたいのは、私のクラスライブラリ内の接続文字列をハードコードし、エンティティ(文字列名):base(name)を呼び出すことです。私は何を達成したいのかを説明していますか? – ironcurtain