Как использовать конструктор для реализации DbContext, когда есть разные строки подключения? - PullRequest
0 голосов
/ 29 августа 2018

Вот мой метод:

public async task<model> GetMemberList(CancellationToken cancelToken, string connString)
{
   try
   {
       await Task.Run(() =>
       {
           using (var dbContext = DbContext.Create(connString))
           {
              // Code Goes Here....
           }
       }, cancelToken);
   }
   catch
   {
      Throw New Exception(); 
   }
}

Здесь я использовал ключевое слово «using», чтобы получить dbContext. В каждом методе я делал это, потому что у нас разные строки подключения. Я надеюсь, что это не плохой способ написания методов в создании сущностей. Я понял это, когда собирался написать модульный тест для каждого метода на бизнес-уровне. Я хочу написать конструктор для получения dbcontext в общем виде. Я могу использовать Dependency Injection, но я не знаю, как это сделать. Может кто-нибудь дать мне способ сделать это?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вам просто нужно скрыть логику построения строки соединений, вы можете использовать шаблон Factory как есть. В этом примере построение строки соединения зависит от clientId и инкапсулируется в фабрике. Вы можете смоделировать это, как вам нравится в ваших модульных тестах для SomeService.

public class CompositionRoot
{
    private readonly IContainer _root;

    public CompositionRoot()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<SomeService>();
        builder.RegisterType<DbContextFactory>().As<IDbContextFactory>();

        _root = builder.Build();
    }

    public T GetService<T>()
    {
        return _root.Resolve<T>();
    }
}

public interface IDbContextFactory
{
    DbContext Get(int clientId);
}

public class DbContextFactory : IDbContextFactory
{
    public DbContext Get(int clientId)
    {
        // place here any logic you like to build connection string
        var connection = $"Data Source={clientId}db";
        return new DbContext(new SqlConnection(connection), true);
    }
}

public class SomeService
{
    private readonly IDbContextFactory _dbFactory;

    public SomeService(IDbContextFactory dbFactory)
    {
        _dbFactory = dbFactory ?? throw new ArgumentNullException(nameof(dbFactory));
    }

    public async Task<Model> GetMemberList(CancellationToken cancelToken, int clientId)
    {
        using (var dbContext = _dbFactory.Get(clientId))
        {
            // Code Goes Here....

        }

        return null;
    }
}
0 голосов
/ 29 августа 2018

Создание и интерфейс IDbFactory

public interface IDbFactory
{
    DbContext GetConnection();
}

Создать класс DbFactory

public class DbFactory : IDbFactory
{ 
    public DbContext GetConnection()
    {
        var connectionString = [get this from web.config]
        return new DbContext.Create(connectionString);
    }
}

Внедрить зависимую для IDbFactory в конструктор, а затем

public async task<model> GetMemberList(CancellationToken cancelToken)
{
   try
   {
       await Task.Run(() =>
       {
           using (var db = _dbFactory.GetConnection())
           {
              // Code Goes Here....
           }
       }, cancelToken);
   }
   catch
   {
      Throw New Exception(); 
   }
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...