Можно ли иметь разные свойства для одной и той же модели в сценарии с несколькими арендаторами? - PullRequest
0 голосов
/ 24 марта 2019

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

Клиент 1 должен использовать какое-то настраиваемое поле, Клиент 2 должен управлять другими полями вта же таблица и т. д. *

Это пример: та же таблица (билет) имеет общий (базовый) список полей, тогда у каждого арендатора должны быть свои дополнительные столбцы в модели:

Я хотел бы сначала внедрить веб-приложение .Net Core для EF Code.

namespace Models.Base
{
    public class TicketBase
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public Datetime CreationDate { get; set; } 
    }
}

Арендатор 1

namespace Models.Tenant1
{
    public class Ticket : TicketBase
    {

        public string CustomerName { get; set; }
        public Datetime DateCustomerCall { get; set; } 
    }
}

Арендатор 2

namespace Models.Tenant2
{
    public class Ticket : TicketBase
    {

        public string AnotherDescription { get; set; }
        public Datetime AnotherDate { get; set; } 
    }
}

Правильно ли проектировать модель таким образом или существуют разные подходы к этой очень распространенной проблеме

1 Ответ

1 голос
/ 24 марта 2019

ИМХО, в SaaS ключом к успеху является наличие единой кодовой базы и гибкой конфигурации / расширения для мультитенантности.

Чтобы включить настраиваемые поля для каждого арендатора, бизнес-модель должна иметь фиксированный набор базовых полей. Пользовательские поля должны быть сохранены entityid и tenantid в отдельной таблице.

Ваши таблицы могут выглядеть так, как показано ниже. Эта модель предпочтительна, так как наличие универсальной таблицы расширений приведет к меньшей масштабируемости и вскоре может быть заполнено объемом данных по мере увеличения использования.

Билет

TicketExtn (таблица расширений, содержащая настраиваемые поля по владельцам и сущностям)

Таблица TicketExtn будет содержать поля типа

TicketId TenantId FieldId FieldValue FieldDataType так далее Когда мы попытаемся получить данные для сущности Ticket, мы также получим данные из таблицы TicketExtn и установим поля в модели.

BaseModel будет выглядеть так, как показано ниже

public class ExtendedField
{
    public Guid Id { get; set; }
    public string FieldName { get; set; }
    public Guid DataTypeId { get; set; }
    /// <summary>
    /// Can also be a typed class, this is just for reference
    /// </summary>
    /// <value>The field value.</value>
    public string FieldValue { get; set; }
    /// <summary>
    /// Incase of using string for fieldvalue, the string to format the value as per the required datatype 
    /// will be provided here.
    /// </summary>
    /// <value>The field value format string.</value>
    public string FieldValueFormatString { get; set; }
}

public class BaseModel
{
    Dictionary<string, ExtendedField> ExtendedRows { get; set; }
}

public class Ticket : BaseModel
{
    public int Id { get; set; }
    public string Description { get; set; }
    public DateTime CreationDate { get; set; }
}

На вашем уровне сервисов будет логика для заполнения этих расширенных строк. Лучше иметь общую логику для заполнения расширенных строк, чтобы эту логику можно было повторно использовать для любого числа объектов.

НТН

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