0

在 ASP.Net Core 中设置 MartenDB 数据存储时,通常将这样的代码放在 Startup.cs 中:

services.AddMarten(o =>
{
    o.Connection(configuration.GetConnectionString("MyDatabase"));
    o.AutoCreateSchemaObjects = AutoCreate.All;
    o.Serializer(new JsonNetSerializer { EnumStorage = EnumStorage.AsString });
});

这允许您随后将 IDocumentSession 和 IDocumentStore 注入到您的各种类中以使用该数据库。

现在,如果您必须连接到第二个数据库,您会怎么做?我查看了ISessionFactory,但您可以从此处更改连接字符串并不明显。您是否需要手动创建和注册新的 DocumentStore?

4

1 回答 1

0

为了回答我自己的问题,我最终为要连接的每个数据库创建了一个自定义 DocumentStore 和 ISessionFactory,然后注入了自定义 SessionFactory。

这是代码(为简洁起见,仅显示每个类的一个实例。只需替换Db1Db2每个类的第二个版本):

自定义 DocumentStore:

public class Db1Store : DocumentStore
{
    public Db1Store(StoreOptions options) : base(options)
    {
    }
}

自定义 SessionFactory:

public class Db1SessionFactory : ISessionFactory
{
    private readonly Db1Store store;

    public Db1SessionFactory(Db1Store store)
    {
        this.store = store;
    }

    public IQuerySession QuerySession()
    {
        return store.QuerySession();
    }

    public IDocumentSession OpenSession()
    {
        return store.OpenSession();
    }
}

服务注册(这取代了services.AddMarten调用):

  services.AddSingleton(p =>
  {
      var options = new StoreOptions();
      options.Connection(configuration.GetConnectionString("DB1"));
      options.AutoCreateSchemaObjects = AutoCreate.All;
      options.Serializer(new JsonNetSerializer { EnumStorage = EnumStorage.AsString });
      return new Db1Store(options);
  });
  
  services.AddSingleton<Db1SessionFactory>();

然后将 Db1SessionFactory 实例注入到您的类中,并运行如下查询:

var result = await db1SessionFactory.QuerySession().Query<MyAwesomeTable>().ToListAsync();

缺点

  • 我更喜欢注入 QuerySession 或 DocumentSession,但如果不迁移到 Autofac 或支持命名实例的类似 DI 容器,我看不到这样做的方法。

  • 我不确定以这种方式创建这些 QuerySession/DocumentSession 会有什么缺点。这可能是一个糟糕的权衡。

于 2021-02-23T12:19:50.417 回答