C#存储库和可本地化的实体
问题描述:
在我的应用程序中,我有许多可本地化的实体。这个实体 的数据库结构是。某些表格中PK的类型可能不同(其中一些是int,一些是bigint)。这取决于多少数据将被存储在一个表中。 我使用Dapper作为ORM。C#存储库和可本地化的实体
现在我有这个解决方案(但里面的东西告诉我,这个解决方案是坏的):
// ENTITY
public abstract class Entity
{
public object Id { get; set; }
}
public abstract class Entity<TKey> : Entity
{
public new TKey Id { get; set; }
}
// LOCALIZABLE ENTITY
public abstract class LocalizableEntity<TTranslation> : Entity
where TTranslation : EntityTranslation
{
public ICollection<TTranslation> Translations { get; set; }
}
public abstract class LocalizableEntity<TKey, TTranslation> : Entity<TKey>
where TTranslation : EntityTranslation
{
public ICollection<TTranslation> Translations { get; set; }
}
// ENTITY TRANSLATION
public abstract class EntityTranslation
{
public object LocalizableId { get; set; }
public int LanguageId { get; set; }
}
public abstract class EntityTranslation<TKey> : EntityTranslation
{
public new TKey LocalizableId { get; set; }
}
// REPOSITORIES
public class BaseRepository: IRepository, IDisposable
{
public string ConnectionString { get; set; }
// ....
}
public abstract class BaseEntityRepository: BaseRepository
{
protected IDbConnection Connection => _connection ?? (_connection = CreateDbConnection(GetConnectionStringValue(ConnectionString)));
protected abstract IDbConnection CreateDbConnection(string connectionString);
// SaveEntity<T>(T entity), DeleteEntity(object id)
}
public abstract class BaseEntityRepository<TEntity, TKey, TSearchOptions, TLoadOptions> : BaseEntityRepository
where TEntity : Entity<TKey>
where TSearchOptions : SearchOptions
where TLoadOptions : LoadOptions
{
// GetEntities(TSearchOptions sopts, TLoadOptions lopts), EntityCount(TSearchOptions) ...
}
public abstract class BaseLocalizableEntityRepository<TEntity, TKey, TEntityTranslation, TSearchOptions, TLoadOptions> : BaseEntityRepository<TEntity, TSearchOptions, TLoadOptions>
where TEntity : Entity<TKey>
where TEntityTranslation : EntityTranslation<TKey>
where TSearchOptions : SearchOptions
where TLoadOptions : LoadOptions
{
// GetTranslations, SaveTranslation ...
}
它是好还是坏?如果不好,我该怎么做?
答
由于您需要高度可定制的本地化,您的解决方案并不那么糟糕。如果我需要翻译,我会以同样的方式执行。但是,而不必为每个实体翻译不同的表我有一个独特的表,它支持翻译参考任何实体:
CREATE TABLE Test_Translations
(
Language char(10) NOT NULL,
TextId int NOT NULL,
Value text NOT NULL,
CONSTRAINT Test_Translations_Language_TextId_pk PRIMARY KEY (Language, TextId)
);
CREATE TABLE Test_LocalizableStrings
(
Id int NOT NULL CONSTRAINT Test2_Test1Id_pk primary key
);
ALTER TABLE Test_Translations ADD FOREIGN KEY (TextId) REFERENCES Test_LocalizableStrings;
然后需要一个翻译支持只需创建一个参考表中Test_LocalizableStrings的关键。在查询时询问TextId
和Language
。
建立在“.resx”文件中的本地化是否适合您?或者您需要高度可定制的本地化?即用户必须编写翻译。 –
@MichaelMairegger我需要高度可定制的本地化。 – Alex
这是一个问题,整理。如果您在一个数据库列中使用不同语言,则可能无法使用给定语言的正确归类排序,因为归类属于该列。我不知道这个解决方案。找到一个会很好,因为这些替代品似乎都涉及动态SQL。 – bbsimonbb