Entity Framework 6 的 Configuration 类是否可以注入(inject)依赖?
例如,像这样:
internal sealed class Configuration : DbMigrationsConfiguration<MyBaseContext>
{
private readonly ILogger _logger;
public Configuration(ILogger logger)
{
this._logger = logger;
AutomaticMigrationsEnabled = true;
}
protected override void Seed(Home.DAL.Data.HomeBaseContext context)
{
//log something
}
}
或者更通用的方法是获得在迁移中注入(inject)代码的可能性:
public partial class InitialMigration : DbMigration
{
private readonly ILogger _logger;
public InitialMigration(ILogger logger)
{
this._logger = logger;
}
public override void Up()
{
CreateTable(...);
}
public override void Down()
{
DropTable(...);
}
}
Entity Framework 6 中的 DI 初始化发生在哪里以定义这些绑定(bind)?
更新
我不是在问我应该使用什么。目前,我正在使用 Ninject,但这是不可能的,因为无论我使用什么,我都应该能够将依赖项注入(inject)到迁移的构造函数中。当然,如果你写的东西像我在上面的例子中写的那样,它只会抛出关于“没有默认构造函数”的异常。
上面例子中的 ILogger 只是依赖的简单例子。如果您有 IGeneratorService 会生成一些数据并且您想使用此服务为 Seed 方法生成数据,情况会更糟。
最佳答案
Entity Framework 6 建议您使用.NET Framework 4.6 或以下版本,并且.NET 4.6 或以下版本没有内置依赖注入(inject)功能,因此您必须使用第三方 DI 容器,如 StructureMap、Ninject 等. 这些 DI 容器为您提供了 3 种获取依赖注入(inject)的方法:通过构造函数、setter 或接口(interface)。
我不完全确定是否可以使用构造函数注入(inject)将依赖项注入(inject)到 Configuration
或 InitialMigration
类中,但我对此表示怀疑。即使有可能,您也无法按照您在问题中描述的方式注入(inject) ILogger
:this._logger = logger
因为 ILogger 是使用 ILoggerFactory Create()
方法。
因此,我认为通常不可能使用构造函数注入(inject)将依赖项注入(inject)到您的 Configuration
或 InitialMigration
类中。
如果你想在你的类中使用ILogger
,下面的代码片段应该可以工作:
internal sealed class Configuration : DbMigrationsConfiguration<MyBaseContext>
{
private readonly ILogger _logger;
public Configuration(ILoggerFactory loggerFactory)
{
this._logger = loggerFactory.Create("ConfigurationLogger");
AutomaticMigrationsEnabled = true;
}
protected override void Seed(Home.DAL.Data.HomeBaseContext context)
{
//log something
_logger.WriteInformation("Seeding data.");
}
}
public partial class InitialMigration : DbMigration
{
private readonly ILogger _logger;
public InitialMigration(ILoggerFactory loggerFactory)
{
this._logger = loggerFactory.Create("InitialMigrationLogger");
}
public override void Up()
{
_logger.WriteInformation("Create table.");
CreateTable(...);
}
public override void Down()
{
_logger.WriteInformation("Drop table.");
DropTable(...);
}
}
关于c# - Entity Framework 种子方法的依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40865755/