Startupクラスでインスタンス化されたSingletonクラスのデータベースにアクセスする必要があります。それを直接注入すると、配置されたDbContextが生成されるようです。ASPでのDbContextの使用.Net Singleton Injectedクラス
私は次のエラーを取得する:
Cannot access a disposed object. Object name: 'MyDbContext'.
私の質問は2つあり:なぜ、この仕事とどのように私はシングルトンクラスのインスタンスで私のデータベースにアクセスすることができないのですか?ここで
は私のスタートアップクラスで私のConfigureServices方法であって、ここで
public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity
services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
options =>
{
var config = Configuration["Data:DefaultConnection:ConnectionString"];
options.UseSqlServer(config);
});
// code removed for brevity
services.AddSingleton<FunClass>();
}
は私のコントローラクラスである:ここで
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
は私FunClassです:それはdoesnの
public class FunClass
{
private MyDbContext db;
public FunClass(MyDbContext ctx) {
db = ctx;
}
public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}
[回答](http://stackoverflow.com/questions/36246896/structuremap-creation-as-transient-per-request-not-working/36249145#36249145)を参照してください。オブジェクトは、自身よりも寿命が短い依存関係を持つことはできません。ファクトリを挿入してより短いインスタンスを作成するか、またはリファクタリングすることで、オブジェクトグラフのルートがシングルトンでないようにすることができます。 – NightOwl888
シングルトンとしてあなたの 'DbContext'を登録することを強くお勧めします。なぜそれが悪い考えであるかを示す多くの記事がウェブ上にあります。 [Simple Injector](https://simpleinjector.org/index)の作成者が提供する[answer](http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) .html)なぜその理由を説明しようとします。 * Repository *や* Unit of Work *パターンのようなパターンを使用することを強くお勧めします。 – QuantumHive
@QuantumHiveありがとうございます。私は私の仕事の答えに警告を書きました。 – Tjaart