ASP.NET Core:DB CF迁移的依赖注入

时间:2016-08-27 16:31:05

标签: c# dependency-injection asp.net-core-mvc entity-framework-core .net-core

我正在使用依赖注入在ASP.NET MVC核心应用程序的控制器中注册我的DbContext,如下所示:

public void ConfigureServices(IServiceCollection services) {
    return new MyContext(connectionString); }
        services.AddScoped<IMyContext, MyContext>((serviceProdiver) => {
            return new MyContext(Configuration["ConnectionStrings:MyContext"]); 
        });
        services.AddMvc();
    }

这很有效。但现在我想使用像Add-Migration Initial -Context MyContext这样需要无参数构造函数的迁移。但是这会破坏DI模式,因为我需要从经典的ASP.NET MVC中回退到单例模式,如下所示:

public class MyContext:MySqlDbContext, IMyContext {
    public MyContext() : base(Startup.Configuration["ConnectionStrings:MyContext"] {
    }
}

我喜欢避免这种情况,因此在我的新ASP.NET Core项目中使用DI。这是否可以使用数据库迁移或者不是针对DI更新的迁移工具,以便在此处使用旧的单例模式没有其他选择?

1 个答案:

答案 0 :(得分:0)

哇,你犯了很大的错误。 您不需要将一些配置添加到MyContext,因为它是 自动生成的文件。 你有什么事吗? 您必须添加一些配置文件,例如RegisterServices,否则它将是扩展名。 例如

public static class ServiceCollectionExtensions
{
 public static IServiceCollection RegisterServices(
    this IServiceCollection services)
{
    services.AddTransient<ICountryService, CountryService>();
    // and a lot more Services

    return services;
}

}

之后,您必须在ConfigureServices中注册此配置文件,例如

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();

services.RegisterServices();
}

最后,您可以使用服务或存储库

public class HomeController : Controller 
{ 
private readonly ICountryService _countryService; 

 public HomeController(ICountryService countryService) 
 { 
    _countryService = countryService; 
 } 
// … 
}

或者,在ASP.NET Core MVC中,我们也可以将此服务注入MVC​​视图。以下行定义了Razor视图中的注入:

@inject DiViews.Services.ICountryService CountryService;

@inject指令后面的第一部分定义了接口。第二部分是保存我们实例的变量的名称。

要将全局服务注入所有视图,请将此行添加到_ViewImports.cshtml。在一个全新的ASP.NET Core项目中,已经为ApplicationInsights定义了一个全局注入:

@inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration

我们现在可以在视图中使用该实例:

@if (countryService.All().Any()) 
{ 
 <ul> 
    @foreach (var country in CountryService.All().OrderBy(x => x.Name)) 
    { 
        <p>@country.Name (@country.Code)</p> 
    } 
 </ul> 
 }

我们还可以使用此服务填写国家/地区列表中的选择字段:

@Html.DropDownList("Coutries", CountryService.All() 
.OrderBy(x => x.Name) 
.Select(x => new SelectListItem 
{ 
    Text = x.Name, 
    Value = x.Code 
}))

我希望,这对你有帮助