在.net c#中使用Unity如何MapTo多个?

时间:2012-08-25 13:43:17

标签: c# .net unity-container

我有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接口。

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

提前致谢,

1 个答案:

答案 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。

因此,此解决方案与我的问题不完全匹配。既然,我还在研究系统设计,也许我会遇到同样的问题。

感谢您的帮助。