2017-07-03 72 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