2012-08-25 58 views
0

我有2個班是這樣的:在.net c#中使用Unity如何將MapTo多重?

1)

public class EFInitializerLanguage : EFInitializerBase, IRepositoryInitializer<Language> 
{ 
    public IEntityRepository<Language> Create() 
    { 
     return this.Model.CreateObjectContext<LanguageData>(new SqlConnection(Utility.ConnectionStrings.ConnDefault)); 
    } 
} 

2)

public class EFInitializerPerson : EFInitializerBase, IRepositoryInitializer<Person> 
    { 
     public IEntityRepository<Person> Create() 
     { 
      return this.Model.CreateObjectContext<PersonData>(new SqlConnection(Utility.ConnectionStrings.ConnDefault)); 
     } 
    } 

而且在Unity.config的定義是(可能這是錯誤的,我想不出出去做什麼)

<unity> 
    <typeAliases> 
<typeAlias alias="IRepositoryInitializer`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" /> 
     <typeAlias alias="EFInitializerPerson" type="Data.Initializers.EFInitializerPerson, Data" /> 

    <typeAlias alias="IRepositoryInitializerLanguage`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" /> 
    <typeAlias alias="EFInitializerLanguage" type="Data.Initializers.EFInitializerLanguage, Data" /> 
<containers> 
     <container> 
      <types> 
<type type="IRepositoryInitializer`1" mapTo="EFInitializerPerson" /> 
     <type type="IRepositoryInitializerLanguage`1" mapTo="EFInitializerLanguage" /> 
</types> 
     </container> 
    </containers> 
</unity> 

你可能會認爲使用1 EFInitializer instea d爲2或更多,但由於輸入和輸出類型的差異,我無法做到。在這一點上,我相信我目前的做法對我來說似乎很好。

在運行時我得到的錯誤是:

依賴解析失敗,類型= 「Contracts.DataManagers.ILanguageManager」,名字= 「」。異常 消息是:當前生成操作(生成密鑰生成 鍵[Contracts.DataManagers.ILanguageManager,null])失敗: 當前類型,Contracts.DataManagers.ILanguageManager,是一個 接口,無法構建。你是否缺少類型映射? (戰略型BuildPlanStrategy,指數3)

看起來,在配置文件中,當它歸結爲有一個實現相同的接口2個不同類別的聲明必須是不同的。

如果你能指出我正確的方向,我會非常高興。

由於提前,

+1

異常是關於'Noxon.Contracts.DataManagers.ILanguageManager'?什麼是'ILanguageManager'?我沒有看到它在你的配置中註冊... – nemesv

+0

是的!你是對的!我猜我衝過去並加入了它。不幸的是,我現在有這個例外 無法投入「Data.Initializers.EFInitializerLanguage」類型的對象來鍵入'Contracts.Repositories.IRepositoryInitializer'1 [Contracts.Entities.Person]'。 –

+0

你需要使用配置嗎?你能切換到代碼嗎? –

回答

0

我不能說這是我的問題的精確解。但我想到了一個解決方法;而不是使用2個EFInitializers的,我合併到一個泛型類型如下:

public class EFInitializer<T, TP>: EFInitializerBase, IRepositoryInitializer<T> 
     where T : class 
     where TP : ObjectContext, IEntityRepository<T> 
    { 
     public IEntityRepository<T> Create() 
     { 
      return this.Model.CreateObjectContext<TP>(new SqlConnection(Utility.ConnectionStrings.ConnDefault)); 
     } 
    } 

和統一配置成爲這個:

<unity> 
    <typeAliases> 
<typeAlias alias="IRepositoryInitializer`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" /> 
     <typeAlias alias="EFInitializer`2" type="Data.Initializers.EFInitializer`2, Data" /> 
</typeAliases> 
    <containers> 
     <container> 
      <types> 
<type type="IRepositoryInitializer`1" mapTo="EFInitializer`2" /> 
</types> 
     </container> 
    </containers> 
</unity> 

那麼,這種方法至少我不會必須爲每個對我而言都很酷的實體編寫EFInitializer。

因此,此解決方案與我的問題不完全匹配。因爲,我仍然在研究系統設計,也許我會遇到同樣的問題。

謝謝你的幫助。