3

我已经实现了EntityFrameworkFileProvider我的ASP.NET核心的Web应用程序,我想ViewDbContext实例由ASP.NET核心DI框架在构造函数中注入:如何正确注入startup.cs的ConfigureServices方法中的DbContext实例(ASP.net core 1.1)?

ViewDbContextdbContext

public class EntityFrameworkFileProvider : IFileProvider 
{ 
    private ViewDbContext _context; 

    public EntityFrameworkFileProvider(ViewDbContext context) 
    { 
     /* should be injected by asp.net core DI */ 
     _context = context; 
    } 
    public IDirectoryContents GetDirectoryContents(string subpath) 
    { 
     ..... 
    } 

    public IFileInfo GetFileInfo(string subpath) 
    { 
     var result = new DatabaseFileInfo(_context, subpath); 
     return result.Exists ? result as IFileInfo : new NotFoundFileInfo(subpath); 
    } 

    public IChangeToken Watch(string filter) 
    { 
     return new DatabaseChangeToken(_context, filter); 
    } 
} 

现在我将EntityFrameworkFileProvider添加到RazorViewEngineOption在startup.cs 如何使ViewDbContext实例被DI框架自动注入到startup.cs的ConfigureServices方法中?我应该如何正确地调用EntityFrameworkFileProvider构造函数?

在Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
     /* Add EntityFrameworkFileProvider to Razor engine */ 
     services.Configure<RazorViewEngineOptions>(opts => 
     { 
      opts.FileProviders.Add(new EntityFrameworkFileProvider(null?)); 
     }); 

     services.AddMvc(); 
} 

回答

2

我想我已经找到了解决办法!任何想法?

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ViewDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
    ... 
    /* Add EntityFrameworkFileProvider to Razor engine */  
    var context = services.BuildServiceProvider() 
         .GetService<ViewDbContext>(); 

    services.Configure<RazorViewEngineOptions>(opts => 
    { 
     opts.FileProviders.Add(new EntityFrameworkFileProvider(context)); 
    }); 

    services.AddMvc(); 
} 
+0

使用你的方法,是不是说同一个上下文对象被一次又一次地使用......每次框架想要检索文件细节或检查文件是否已经改变。如果上下文正在跟踪对象,这可能会导致内存泄漏。我看到的示例为每个调用使用了一个新的数据库上下文。 –

相关问题