我有2个这样的课程:
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而不是2或更多,但由于输入和输出类型的差异,我无法做到。在这一点上,我相信我目前的做法对我来说似乎很好。
我在RunTime期间得到的错误是:
依赖项的解析失败,type = “Contracts.DataManagers.ILanguageManager”,name =“”。例外 消息是:当前的构建操作(构建密钥Build 键[Contracts.DataManagers.ILanguageManager,null])失败: 当前类型,Contracts.DataManagers.ILanguageManager,是一个 界面,不能构造。你错过了类型映射吗? (策略类型BuildPlanStrategy,索引3)
看起来,在配置文件中,声明必须是不同的,因为它有两个不同的类来实现SAME接口。
如果你能指出我正确的方向,我会很高兴。
提前致谢,
答案 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。
因此,此解决方案与我的问题不完全匹配。既然,我还在研究系统设计,也许我会遇到同样的问题。
感谢您的帮助。