2016-11-29 15 views
10

Có thể tiêm phụ thuộc vào lớp Cấu hình của Entity Framework 6 không?Dependency Injection vào phương thức Seed Entity Framework?

Ví dụ như thế này:

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 
    } 
} 

Hoặc tổng quát hơn cách tiếp cận là để có được khả năng để đưa mã thậm chí bên trong di cư:

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(...); 
    } 
} 

đâu DI khởi xảy ra trong Entity Framework 6 để xác định những ràng buộc đó?

CẬP NHẬT

Im không hỏi về những gì tôi nên sử dụng. Hiện nay, Im sử dụng Ninject nhưng đó là câu hỏi, bởi vì bất cứ điều gì tôi sử dụng, tôi sẽ có thể tiêm dependecies vào constructor của di cư. Của courser nếu bạn viết một cái gì đó như tôi đã viết trong ví dụ trên nó sẽ chỉ ném bạn ngoại lệ về "không có constructor mặc định".

ILogger trong ví dụ trên chỉ là ví dụ đơn giản về sự phụ thuộc. Mọi thứ trở nên tồi tệ hơn nếu bạn có IGeneratorService sẽ tạo ra một số dữ liệu và bạn muốn sử dụng dịch vụ này để tạo dữ liệu cho phương thức Seed.

+0

Việc khởi tạo DI phải được xử lý bởi khung DI của bạn. –

+0

Câu trả lời này cho bất kỳ phần nào của câu hỏi này? – eocron

+0

Bạn đã thử sử dụng bất kỳ khung công tác DI nào chưa? – ColinM

Trả lời

5

Khuôn khổ thực thể 6 cho thấy bạn đang sử dụng .NET Framework 4.6 trở xuống và không có khả năng tiêm phụ thuộc được tích hợp cho .NET 4.6 trở xuống để bạn phải sử dụng các vùng chứa DI bên thứ ba như StructureMap, Ninject, vv Những container DI cung cấp cho bạn 3 cách để có được tiêm phụ thuộc: thông qua các nhà xây dựng, setter, hoặc giao diện.

Tôi không hoàn toàn chắc chắn nếu nó có thể sử dụng tiêm xây dựng để tiêm phụ thuộc vào Configuration hoặc InitialMigration lớp học, nhưng tôi nghi ngờ nó. Ngay cả khi có thể, bạn sẽ không thể tiêm ILogger cách bạn mô tả trong câu hỏi của mình: this._logger = logger vì ILogger được khởi tạo bằng phương pháp ILoggerFactory Create().

Vì vậy, tôi không nghĩ rằng nó có thể tiêm phụ thuộc vào các lớp Configuration hoặc InitialMigration của bạn bằng cách sử dụng tiêm xây dựng nói chung.

Nếu bạn muốn sử dụng ILogger trong lớp học của bạn, các đoạn mã sau đây nên làm việc:

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(...); 
    } 
} 
0

Tôi không nghĩ như vậy. Chắc chắn không phải khi cố gắng sử dụng cơ sở dữ liệu cập nhật từ dòng lệnh. Hãy nhớ rằng thùng chứa DI của bạn được đăng ký tại thời gian chạy. Sẽ không có dịch vụ nào được đăng ký để tiêm bất cứ nơi đâu. Thêm vào đó, EF đang tìm kiếm một tệp cấu hình với một hàm tạo ít tham số. Bạn có thể nhanh chóng tự kiểm tra điều này bằng ví dụ từ câu hỏi của bạn. Bạn sẽ nhận được một "Không có kiểu cấu hình di chuyển nào được tìm thấy trong assembly" Your.Assembly ".

Nếu bạn đang tìm cách thực hiện một số hành động từ một dịch vụ trong phương pháp hạt giống của bạn thì tôi sẽ đề nghị xem xét api thời gian chạy đã được trả lời here.

Tôi sử dụng ứng dụng bảng điều khiển trong các dự án của mình để tôi có thể gửi các lệnh đến như một phần của kênh xây dựng khi triển khai. Bạn có thể dễ dàng sử dụng cách tiếp cận này trong cơ sở mã thực của bạn.

private void RunMigrations() 
    { 
     Console.WriteLine("Starting migrations..."); 
     var configuration = new Configuration 
     { 
      TargetDatabase = new DbConnectionInfo(_connectionString, "System.Data.SqlClient") 
     }; 
     var dbMigrator = new DbMigrator(configuration); 
     dbMigrator.Update(); 
     Console.WriteLine("Migrations completed"); 

     //add your service here and do whatever you want. 
    } 

    private void Seed() 
    { 
     using (var MyContext = new MyContext(_connectionString)) 
     { 
      Console.WriteLine("Seeding test data into database"); 
      //this is a custom seed method 
      Initialize.Seed(_connectionString); 
      Console.WriteLine("Seeding test data is complete"); 

      //add your service here and do whatever you want. 
     } 
    } 
Các vấn đề liên quan