我正在使用依赖注入在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更新的迁移工具,以便在此处使用旧的单例模式没有其他选择?
答案 0 :(得分:0)
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
}))
我希望,这对你有帮助