Götürmezse nedeni: Burada
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>();
}
benim denetleyicisi sınıftır: Burada
benim Başlangıç sınıfında benim ConfigureServices yöntemidir benim FunClass İşte
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
olduğunu Çalışmak, .AddDbContext
uzantısının istek başına kapsamda eklenmesidir. İstek başına, genel olarak istediğiniz gibi olur ve tipik olarak, değişiklikleri kaydeder istek başına bir kez çağrılır ve ardından isteğin sonunda dbcontext
belirtilir. Eğer gerçekten bir singleton
içinde bir dbContext
kullanmanız gerekirse
, sonra FunClass
sınıf muhtemelen doğrudan DbContext
bir bağımlılık alarak yerine IServiceProvider
ve DbContextOptions
üzerine bunu kendiniz oluşturabilirsiniz bu şekilde bir bağımlılık almalıdır. Benim tavsiyem dikkatli bunu bir tekil yapmak için çok iyi bir nedeniniz olmadıkça gerçekten, bunu önleyeceğini a tek olmak için FunClass gerekip gerekmediğini dikkate almak olacağını söyledi
public class FunClass
{
private GMBaseContext db;
public FunClass(IServiceProvider services, DbContextOptions dbOptions)
{
db = new GMBaseContext(services, dbOptions);
}
public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}
.
public class MyContext : IdentityDbContext<ApplicationUser>
{
private string connectionString;
public MyContext()
{
}
public MyContext(DbContextOptions options, string connectionString)
{
this.connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Used when instantiating db context outside IoC
if (connectionString != null)
{
var config = connectionString;
optionsBuilder.UseSqlServer(config);
}
base.OnConfiguring(optionsBuilder);
}
}
olarak birden fazla kişi:
services.AddSingleton(s => new FunClass(new MyContext(null, Configuration["Data:DefaultConnection:ConnectionString"])));
çözüm benim DBContext sınıfını değiştirmek oldu:
Bkz. [Bu yanıt] (http://stackoverflow.com/questions/36246896/structuremap-creation-as-transient-per-request-not-working/36249145#36249145). Bir nesne, kendisinden daha kısa bir yaşam süresine sahip bağımlılıklara sahip olamaz. Daha kısa ömürlü örnekler oluşturmak için bir fabrika enjekte edebilir veya nesne grafiğinin kökü bir tek kişilik olmadığından yeniden düzenleyici ekleyebilirsiniz. – NightOwl888
“DbContext” inizi bir Singleton olarak kaydettirmenizi şiddetle tavsiye ediyorum, web'de size neden kötü bir fikir olduğunu söyleyen birçok makale var. İşte [Basit Enjektör] (https://simpleinjector.org/index) tarafından sağlanan [cevap] (http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) .html) nedenini açıklamaya çalışır. * Repository * veya * Unit of Work * desenleri gibi bir desen kullanmayı şiddetle öneririm. – QuantumHive
@QuantumHive teşekkürler. Çalışma cevabımda bir uyarı belirttim. – Tjaart