偉大な質問、すでに2つの大きな答え。私はまずこれに困惑し、問題を解決するために以下の解決策を思いつきました。マネージャーにリポジトリをカプセル化しています。マネージャ自体は、接続文字列を抽出し、それをリポジトリに注入する責任があります。
私は、モックコンソールアプリケーションのようにリポジトリを個々にテストする方がはるかに簡単であるというこのアプローチを見つけました。そして、私はいくつかの大規模なプロジェクトでこのパターンに従って多くの運があります。私は確かにテスト、依存症注入、または何かの専門家ではありません本当に何か!
私が尋ねた主な質問は、DbServiceがシングルトンであるべきかどうかです。私の理論的根拠は、DbService
にカプセル化されたさまざまなリポジトリを常に作成して破壊する点はあまりなく、ステートレスなので、「生きる」ことに大きな問題は見られませんでした。これは完全に無効なロジックかもしれませんが。
EDIT:あなたは既製のソリューションをしたいなら、以下のようにGitHub
に私のDapperのリポジトリの実装をチェックアウトするリポジトリマネージャが構成されています
/*
* Db Service
*/
public interface IDbService
{
ISomeRepo SomeRepo { get; }
}
public class DbService : IDbService
{
readonly string connStr;
ISomeRepo someRepo;
public DbService(string connStr)
{
this.connStr = connStr;
}
public ISomeRepo SomeRepo
{
get
{
if (someRepo == null)
{
someRepo = new SomeRepo(this.connStr);
}
return someRepo;
}
}
}
サンプルリポジトリが構造化されるだろう
/*
* Mock Repo
*/
public interface ISomeRepo
{
IEnumerable<SomeModel> List();
}
public class SomeRepo : ISomeRepo
{
readonly string connStr;
public SomeRepo(string connStr)
{
this.connStr = connStr;
}
public IEnumerable<SomeModel> List()
{
//work to return list of SomeModel
}
}
それをすべてアップ配線:
/*
* Startup.cs
*/
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//...rest of services
services.AddSingleton<IDbService, DbService>();
//...rest of services
}
そして最後に、それを使用して:
public SomeController : Controller
{
IDbService dbService;
public SomeController(IDbService dbService)
{
this.dbService = dbService;
}
public IActionResult Index()
{
return View(dbService.SomeRepo.List());
}
}
私は工場のアプローチを好むが、どのように1は、複数のデータソースの(データベース)とのシナリオを処理するだろう、単一のアプリケーションのために?データベースごとに子の 'ISomeDbConnectionFactory'を作成し、追加のパラメータをファクトリに渡して、どの接続を作成する必要があるかを判断します。あるいはもっとエレガントなもの? –
私は、同じリポジトリが単一のデータソースへの接続を使用すると仮定します。この場合、私はデータソース固有の接続ファクトリのアプローチに行きます。ファクトリのインタフェースは、DB固有の実装と同じにすることができます。 –
MARSを有効にしても、同じ 'SqlConnection'を使用して複数の同時リクエストを処理することはできません。 [MSDN](https://msdn.microsoft.com/en-us/library/h32h3abf(v = vs.110).aspx)によると: "MARS操作はスレッドセーフではありません"。 – Steven