Внедрение зависимостей в класс сущностей - PullRequest
0 голосов
/ 28 июня 2018

Используя Asp.Net Core, мы можем использовать Dependency Injection в контроллерах / репозиториях.

Тем не менее, я хотел бы сделать некоторые записи в моем классе сущности.

class Person
{
    private ILogger<Person> _logger;
    private List<Pets> pets;

    public Person(ILogger<Person> logger)
    {
        _logger = logger;
    }

    public bool HasCat()
    {
        _logger.LogTrace("Checking to see if person has a cat.");
        // logic to determine cat ownership
        hasCat = true;
        return hasCat;
    }
}

Когда класс Person создается экземпляром EntityFramework, он не пытается внедрить какие-либо зависимости.

Могу ли я заставить это? Я поступаю об этом совершенно неправильно?

Ultimatley Я просто хочу иметь возможность последовательно использовать ведение журнала во всем приложении.

Спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Возможно, но я не рекомендую этого, потому что я согласен с комментаторами, что ведение журнала принадлежит вашим службам и контроллерам.

EF Core 2.1 позволяет внедрить DbContext в приватный конструктор, который EF будет вызывать. См. официальные документы .

Сначала вам нужно предоставить свойство LoggerFactory в вашем классе DbContext.

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options, ILoggerFactory loggerFactory = null)
    {
        LoggerFactory = loggerFactory;
    }

    public ILoggerFactory LoggerFactory { get; }
}

Затем вы можете внедрить DbContext в закрытый конструктор в вашем классе сущности.

public class Person
{
    private readonly ILogger _logger;

    public Person() { } // normal public constructor

    private Person(MyDbContext db) // private constructor that EF will invoke
    {
        _logger = db.LoggerFactory?.CreateLogger<Person>();
    }

    public bool HasCat()
    {
        _logger?.LogTrace("Check has cat");
        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...