0

我有两个这样的课程:

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 个或更多,但由于输入和输出类型的差异,我无法做到。在这一点上,我相信我目前的方法对我来说似乎很好。

我在运行时得到的错误是:

依赖项解析失败,type = "Contracts.DataManagers.ILanguageManager",name = ""。异常消息为:当前构建操作(构建密钥 Build Key[Contracts.DataManagers.ILanguageManager, null])失败:当前类型 Contracts.DataManagers.ILanguageManager 是接口,无法构建。您是否缺少类型映射?(策略类型 BuildPlanStrategy,索引 3)

看起来,在配置文件中,当归结为有 2 个实现相同接口的不同类时,声明必须不同。

如果你能指出我正确的方向,我会很高兴。

提前致谢,

4

1 回答 1

0

我不能说这是我的问题的确切解决方案。但我想到了一个解决方法;我没有使用 2 个 EFInitializer,而是将其合并为一个通用类型,如下所示:

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,这对我来说非常酷。

结果,此解决方案与我的问题不完全匹配。因为,我还在做系统设计,也许我会遇到同样的问题。

感谢您的帮助。

于 2012-08-27T18:53:49.897 回答