我尝试编写MVC n层应用程序。我在连接数据库时使用了存储库模式。在我的存储库类中,我在存储库类中有一个Context变量。我不确定这种做法是否属实。这是我的代码:
public class TTPDbContext : DbContext
{
public TTPDbContext() : base("TTPContext")
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TTPDbContext>());
Database.Log = s => Debug.WriteLine(s);
Configuration.AutoDetectChangesEnabled = true;
}
public DbSet<Kisi> Kisiler { get; set; }
public DbSet<BakanlikBirim> BakanlikBirimleri { get; set; }
public DbSet<DisBirim> DisBirimler { get; set; }
public DbSet<Kullanici> Kullanicilar { get; set; }
public DbSet<Talep> Talepler { get; set; }
public DbSet<UnvanPozisyon> UnvanPozisyonlar { get; set; }
public DbSet<TalepDurum> TalepDurumlar { get; set; }
public DbSet<TalepKagidi> TalepKagidi { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("OsiTtp");
}
}
这是存储库类:
public class TTPRepository : ITTPRepository,IDisposable
{
private IErrorHandling _errorHandling;
private TTPDbContext _context;
public TTPRepository()
{
this._errorHandling = new ErrorHandling();
this._context = new TTPDbContext();
}
// other sections has been dismissed for brevity.
public List<DisBirim> GetAllExternalInstitutions()
{
List<DisBirim> result = null;
DbSet<DisBirim> intermediaryresult = null;
try
{
result = new List<DisBirim>();
intermediaryresult = this._context.DisBirimler;
if (intermediaryresult != null)
{
foreach (DisBirim institution in intermediaryresult)
{
result.Add(institution);
}
}
}
catch (Exception Hata)
{
this.yazHata(Hata);
}
return result;
}
public void Dispose()
{
this._context.Dispose();
}
}
我不确定这是一种最佳方法。你有什么建议吗?提前致谢。
答案 0 :(得分:1)
我建议您阅读msdn documentation
而不是这个
public TTPRepository()
{
this._errorHandling = new ErrorHandling();
this._context = new TTPDbContext();
}
试试这个
public TTPRepository(TTPDbContext context,ErrorHandling errorHandler)
{
this._errorHandling = errorHandler;
this._context = context;
}
通过此,您的存储库已准备好使用context
和Error Handler
。我总是建议使用像IErrorHandler
和IDbContext
这样的东西而不是具体的类。
所以你可以像这样自由地进行初始化。即使您使用IoC容器,您也可以控制Context的生命周期。
var yourRepo = new TTPRepository(new TTPDbContext());
答案 1 :(得分:0)
当使用存储库模式和接口最佳实践时,使用IoC Container将DbContext注入存储库构造函数。
如果您使用的是IoC容器,则可以控制DbContext的生命周期,以确保Repository的所有实例都获得相同的Context。
你必须拥有一个IoC容器,如Unity,Ninject,Autofac,......
统一使用的文件Dependency Injection in ASP.NET MVC - An Introduction