c# - Entity Framework 种子方法的依赖注入(inject)?

标签 c# entity-framework

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)到 ConfigurationInitialMigration 类中,但我对此表示怀疑。即使有可能,您也无法按照您在问题中描述的方式注入(inject) ILogger:this._logger = logger 因为 ILogger 是使用 ILoggerFactory Create() 方法。

因此,我认为通常不可能使用构造函数注入(inject)将依赖项注入(inject)到您的 ConfigurationInitialMigration 类中。

如果你想在你的类中使用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/

相关文章:

LINQ 查询语法到方法语法

entity-framework - Entity Framework - 如何修改生成的基本构造函数(DBContext)

c# - 避免 Linq-To-Objects 但允许重用代码

c# - C# 何时可以推断参数的类型?

c# - Mono:是否支持更改线程的优先级?

javascript - <asp :TextBox> should accept only numbers

sql - Entity Framework : How to properly handle exceptions that occur due to SQL constraints

c# - 如何在现有( Entity Framework )数据库中使用 SqlProvider 表

c# - .NET 4 是否支持任何 6-Sigma 计算?

c# - 如何在不更改 COM 类 ID 的情况下向类添加方法