2017-07-03 35 views
0

在我的应用程序中,我有许多可本地化的实体。这个实体 的数据库结构是here。某些表格中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 ... 
} 

它是好还是坏?如果不好,我该怎么做?

+0

建立在“.resx”文件中的本地化是否适合您?或者您需要高度可定制的本地化?即用户必须编写翻译。 –

+0

@MichaelMairegger我需要高度可定制的本地化。 – Alex

+0

这是一个问题,整理。如果您在一个数据库列中使用不同语言,则可能无法使用给定语言的正确归类排序,因为归类属于该列。我不知道这个解决方案。找到一个会很好,因为这些替代品似乎都涉及动态SQL。 – bbsimonbb

回答

0

由于您需要高度可定制的本地化,您的解决方案并不那么糟糕。如果我需要翻译,我会以同样的方式执行。但是,而不必为每个实体翻译不同的表我有一个独特的表,它支持翻译参考任何实体:

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; 

Resulting Tables

然后需要一个翻译支持只需创建一个参考表中Test_LocalizableStrings的关键。在查询时询问TextIdLanguage