Ядро EF Использование универсальной фабрики для регистрации контекста БД - PullRequest
1 голос
/ 28 апреля 2019

Я в море с этим.

Я получил этот ответ , который был исправлен здесь Nkosi ... однако пока он указывал, как переписать фабрику, я не справляюсь с задачей его реализации .. Мне нужно заполнены некоторые пробелы.

Насколько я понимаю, это то, что мне нужно сделать ..

определить интерфейс:

public interface IContextFactory<TContext> where TContext : DbContext 
{
    TContext Create(string connectionString);
}

Создать фабрику:

public class ContextFactory<TContext> : IContextFactory<TContext>
    where TContext : DbContext
{
    public TContext Create(DbContextOptions<TContext> options)
    {
        return (TContext)Activator.CreateInstance(typeof(TContext), options);
    }
}

зарегистрировать фабрику как одиночную при запуске.

Это то, что я сделал, и я не знаю, правильно ли это?

services.AddSingleton(typeof(IContextFactory<>), typeof(ContextFactory<>));

Далее, какого черта я использую эту фабрику?

В первом ответе было предложено использовать это:

public class EntityBaseRepository<T> : IEntityBaseRepository<T> where T : class, IEntityBase, new()
{
    private JobsLedgerAPIContext _context;

    public string ConnectionString { get; set; }

    public EntityBaseRepository(IContextFactory<JobsLedgerAPIContext> factory)
    {
        _context = factory.CreateDbContext(ConnectionString);
    }

    public virtual IQueryable<T> GetAll()
    {
        return _context.Set<T>().AsQueryable();
    }

    public virtual int Count()
    {
        return _context.Set<T>().Count();
    }
}

Nkosi определил, что вы не можете иметь ограничение "new ()" и параметризованный конструктор. Он переписал это. Как мне изменить приведенный выше код, чтобы отразить тот факт, что на фабрике теперь нет параметризованного конструктора, но все еще используется строка подключения, заданная фабрикой Нкоси?

ClientRepository наследует вышеуказанное.

public class ClientRepository : EntityBaseRepository<Client>, IClientRepository
{
    private new JobsLedgerAPIContext _context;

    public ClientRepository(JobsLedgerAPIContext context) : base(context)
    {
        _context = context;
    }

Нужно ли менять этот конструктор.

И, наконец, как я могу внедрить ClientRepository теперь, когда мне нужно указать строку подключения?

...