Использование нескольких баз данных в одном контроллере webapi - PullRequest
0 голосов
/ 12 октября 2018

У меня есть проект webapi dotnet core (2.1) с EntityFramework (2.1)

У меня есть IProjectRepository интерфейс:

public interface IProjectRepository
{
    void GetProject(Guid id);
    void DeleteProject(Guid id);
    Project CreateProject(Project prj);
    int SaveChanges();
}

Я также реализую его в ProjectRepository класс:

public class ProjectRepository : IProjectRepository
{
    private readonly ProjectContext context;

    public ProjectRepository(ProjectContext context)
    {
        this.context = context;
    }

    public Project GetProject(Guid id)
    {
        return context.Projects.Find( id );
    }

    public void DeleteProject(Guid id)
    {
        context.Projects.Remove( project );
    }

    public void CreateProject(Project prj)
    {
        context.Projects.Add(project);
    }

    public int SaveChanges()
    {
        return context.SaveChanges();
    }
}

Далее у меня есть ProjectsController:

[Route( "api/[controller]" )]
[ApiController]
public class ProjectsController : ControllerBase
{
    private readonly IProjectRepository projectRepository;

    public ProjectsController(IProjectRepository projectRepository)
    {
        this.projectRepository = projectRepository;
    }

    [HttpGet( "{id}", Name = "GetProject" )]
    public ActionResult<Project> GetProjectById( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }
        return project;
    }

    [HttpDelete( "{id}" )]
    public IActionResult DeleteProject( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }

        projectRepository.RemoveProject( project );
        projectRepository.SaveChanges();
        return NoContent();
    }

    /* etc. */
}

Я настраиваю хранилище в функции Startup.cs - ConfigureServices:

services.AddDbContext<ProjectContext>( opt => opt.UseSqlite( "Data Source=" + projectsPath + "\\Projects.db" ) );
services.AddScoped<IProjectRepository, ProjectRepository>();

Чего я хочу добиться - это использовать разные базы данных внутри одного контроллера, а также использовать один Model.Итак, если у меня есть два разных HttpPost -запроса в моих ProjectController:

[HttpPost("{id}/foo")]

и

[HttpPost("{id}/bar")]

В случае foo Я хочу написать в foo.dbа в случае bar я хочу написать bar.db.Простое добавление нескольких вызовов к services.AddDbContext<ProjectContext>, очевидно, не сработает.Какой хороший подход для достижения моей цели?

1 Ответ

0 голосов
/ 12 октября 2018

Простое добавление нескольких вызовов к службам. Очевидно, что AddDbContext не будет работать.

Этот подход будет работать, если вы используете наследование и вызываете AddDbContext с дочерними классами.

Определите еще два контекста, которые наследуются от ProjectContext.

public class FooContext : ProjectContext {}

public class BarContext : ProjectContext {}

Затем зарегистрируйте их с разными строками подключения.

services.AddDbContext<FooContext>(opt => opt.UseSqlite("..."))

services.AddDbContext<BarContext>(opt => opt.UseSqlite("..."))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...