【问题标题】:.NET 6 Api multiple repositories (factory pattern).NET 6 Api 多个存储库(工厂模式)
【发布时间】:2022-04-05 14:19:15
【问题描述】:

我对 .NET Core 很陌生(之前一直使用经典框架),不知道如何解决。

我需要创建一个从不同数据库返回公共对象的 API。在此示例中,我使用名为“Usuarios”的表连接到 DB1,并使用名为“Users”的表连接到 DB2。两个表都有不同的字段名称。

在此示例中,我使用了 2 个数据库,但我的想法是在未来添加更多。所以请考虑一个包含 N 个数据库的解决方案。

我有 2 个模型,分别在文件夹中。每个模型都有自己的上下文和一个用户对象。

由于每个数据库都有不同的用户表属性(不同的字段名称等),我创建了一个通用对象:

这个想法是,当你使用 Api 获取所有用户时,你会得到 IEnumerable

然后我为每个数据库都有一个存储库:

接口定义了一个GetAll方法:

然后,每个存储库都实现接口:

对于上下文 1:

对于上下文 2:

现在,让我们看看控制器:

查看控制器:

我不想在构造函数中设置每个存储库,因为将来我添加第三个数据库时,我需要更改所有控制器的构造函数。

我想在每种方法上获取一个参数来选择要连接的数据库。在示例中,Get 方法具有选择要使用的存储库的 db 参数。但是,当然,我不想在每个方法上做一个切换来选择要使用的存储库。

最好的解决方法是什么?

我还展示了我的 Program.cs:

感谢您的帮助

【问题讨论】:

  • 我会为每个数据库公开 N 个不同的端点。

标签: c# asp.net-core .net-core asp.net-core-webapi factory-pattern


【解决方案1】:

在控制器中,您只需要添加如下界面即可。

public class UsuariosController : ControllerBase
    {
        private readonly IServiceProvider _serviceProvider;
        public UsuariosController(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        [HttpGet("Get")]
        public IEnumerable<DTO_Usuario> Get(int Db)
        {
            IUsuarioRepository usuarioRepository = Db switch
            {
                1 => _serviceProvider.GetRequiredService<Usuario_DB1Repository>(),
                2 => _serviceProvider.GetRequiredService<Usuario_DB2Repository>(),
                _ => _serviceProvider.GetRequiredService<Usuario_DB1Repository>(),
            };
            return usuarioRepository.GetAll();
        }
    }

通过使用Microsoft.Extensions.DependencyInjection,可以调用任意服务。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多