C# Конфигурация сопоставлений UDT Cassandra - лучший подход - PullRequest
0 голосов
/ 19 апреля 2020

Есть ли лучший способ написания UDTMaps, такой же, как таблицы, использующие базу данных Cassandra с C# драйвером

Предположим, что в базе данных Cassandra есть таблица с именем Users (Id, имя, замороженный адрес). , Теперь, чтобы сопоставить это с C# для таблиц, я могу написать, как показано ниже:

public class AppMappings : Mappings
    {
        public AppMappings()
        {
              For<User>()
               .TableName("Users")
               .Column(u => u.Id, cm => cm.WithName("userId"))
               .Column(u => u.Name, cm => cm.WithName("username"))
               .Column(u => u.AddressDetails , cm => cm.WithName("address"))
               .PartitionKey(u=> u.Id);
        }
    }

public class User 
{
   public Guid Id {get;set;}
   public string Name {get;set;}
   public Address AddressDetails {get;set;}
}

public class Address {
   public string State {get;set;}
   public string City {get;set;}
}

Теперь я могу применять любые конфигурации с однокомпонентными приложениями, у них может быть много отображений с таблицами. С помощью этой единственной строки я могу инициализировать все сопоставления

MappingConfiguration.Global.Define<AppMappings>();

, но для того, чтобы применить UDT, мне нужно добавить строку ниже.

session.UserDefinedTypes.Define(UdtMap.For<Address>("address_udt"));

Предположим, у меня есть 10/20 UDT, затем я нужно добавить эту строку для каждого UDT. вместо этого есть ли способ добавить UDT Mappings в одном месте, как Mappings? или лучший подход для добавления UDT Mappings?

1 Ответ

2 голосов
/ 20 апреля 2020

К сожалению, у драйвера нет такой утилиты, как эта, для сопоставлений UDT, но вы можете создать что-то похожее на это:

public abstract class CustomUdtMappings
{
    private readonly IDictionary<Type, UdtMap> _definitions = new Dictionary<Type, UdtMap>();

    public UdtMap[] Definitions => _definitions.Values.ToArray();

    public UdtMap<TPoco> For<TPoco>(string udtName = null, string keyspace = null) where TPoco : new()
    {
        if (_definitions.TryGetValue(typeof(TPoco), out var map) == false)
        {
            map = UdtMap.For<TPoco>(udtName, keyspace);
            _definitions.Add(typeof(TPoco), map);
        }

        return (UdtMap<TPoco>) map;
    }
}

Затем создайте свой класс сопоставлений, который содержит сопоставления udt:

public class MyAppUdtMappings : CustomUdtMappings
{
    public MyAppUdtMappings()
    {
        For<Udt1>("udt1")
            .Map(udt => udt.Id, "iid")
            .Map(udt => udt.Column1, "aasd");

        For<Udt2>("udt2")
            .Map(udt => udt.Id, "iiid")
            .Map(udt => udt.Column1, "aaasd");
    }
}

И вы можете использовать это следующим образом:

await session.UserDefinedTypes.DefineAsync(new MyAppUdtMappings().Definitions).ConfigureAwait(false);

Я думаю, что имеет смысл добавить что-то подобное в драйвер, поэтому я создал https://datastax-oss.atlassian.net/browse/CSHARP-897 чтобы отследить это.

...