首页新闻找找看学习计划

Unity在Xml配制文件使用泛型出错

0
悬赏园豆:200 [已解决问题] 解决于 2017-06-05 14:34
private static UnityContainer BuildContainerByConfig()
        {
            var container = new UnityContainer();
            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = HttpContext.Current.Server.MapPath("~/Unity.config") };
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            UnityConfigurationSection unitySection = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);

            //使用代码注册运行正常
            container.RegisterType<IBaseRepository<SysSample, string>, BaseRepository<SysSample, string>>("SysRep1");

            container.LoadConfiguration(unitySection, "defaultContainer");
            return container;
        }
复制代码
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
          <namespace name="System" />
          <assembly name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <container name="defaultContainer">
            <register type="ZeroCode.Repository.Data.IUnitOfWork,ZeroCode.Repository.Data" mapTo="ZeroCode.Repository.Data.DbContextDemo,ZeroCode.Repository.Data" >
              <lifetime type="perthread"></lifetime>
            </register>
            <!--使用下面这句配置注册就提示无法注册了-->
            <register type="ZeroCode.Repository.Data.IBaseRepository[SysSample,string],ZeroCode.Repository.Data" mapTo="ZeroCode.Repository.Data.BaseRepository[SysSample,string],ZeroCode.Repository.Data" name="SysRep2"/>

            <!--后面这三句是能够正常运行的-->
            <register type="ZeroCode.Service.Sys.ISysSampleService,ZeroCode.Service.Sys" mapTo="ZeroCode.Service.Sys.SysSampleService,ZeroCode.Service.Sys"/>
            <register type="ZeroCode.Repository.Account.IUserRepository,ZeroCode.Repository.Account" mapTo="ZeroCode.Repository.Account.UserRepository,ZeroCode.Repository.Account"/>
            <register type="ZeroCode.Service.Account.IUserService,ZeroCode.Service.Account" mapTo="ZeroCode.Service.Account.UserService,ZeroCode.Service.Account"/>
          </container>
  </unity>
复制代码

首先,SysSample是命名空间ZeroCode.Repository.Data下的一个EF实体

使用container.RegisterType<IBaseRepository<...>, BaseRepository<...>>("SysRep1");能够正常注册

但是换成等同的XML配置就失败了

园豆不多就200,但这是我的全部了

雄介的主页 雄介 | 初学一级 | 园豆:22
提问于:2017-06-05 11:38
< >
分享
最佳答案
0
 <register type="Data.IEntityConditionList[[Model.IndexProjname, Model],[Model.QueryCities, Model]], NewP.Interface"  mapTo="XXXDapper.SqlListByCondition[[Model.IndexProjname, Model],[Model.QueryCities, Fang.Model]], XXXDapper" name="IndexProjnameList">
通过代码typeof查看如何填写配置:

【type】
var te = typeof(IBaseRepository<SysSample, string>);
string str = te.AssemblyQualifiedName;
【mapTo】
var te = typeof(BaseRepository<SysSample, string>);
string str = te.AssemblyQualifiedName;

然后把里面没用的标签属性删掉即可“ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
收获园豆:200
傲翼飞寒 | 菜鸟二级 |园豆:404 | 2017-06-05 14:06

非常非常感谢!已经能成功注册了!

另外我想进一步了解一下,为什么最后产生的结果会是IBaseRepository`2呢?比起常规的写法多了个`2,望再次赐教,最后表示再次感谢帮大忙了

<register type="ZeroCode.Repository.Data.IBaseRepository`2[[ZeroCode.Repository.Data.SysSample, ZeroCode.Repository.Data],[System.String]], ZeroCode.Repository.Data" mapTo="ZeroCode.Repository.Data.BaseRepository`2[[ZeroCode.Repository.Data.SysSample, ZeroCode.Repository.Data],[System.String, mscorlib]], ZeroCode.Repository.Data"/>

 

雄介 | 园豆:22 (初学一级) | 2017-06-05 14:33

`2表示IBaseRepository接口有两个参数

一般IOC容器(autofac也类似)归根到底都差不多使用Emit反射做的(这里的反射不用担心性能),所以typeof可以得到类的标签信息

`2的出现,个人猜测有可能,是因为参数太多,“[]”不能明确标识有几个参数(多了自己看着也乱),所以用`2明确标识参数个数

傲翼飞寒 | 园豆:404 (菜鸟二级) | 2017-06-05 17:37
其他回答(1)
0

Unity在xml中注册泛型应该是用"`",在键盘1号键左侧的那个按键。关于详情你可以百度。、

Emrys5 | 园豆:223 (菜鸟二级) | 2017-06-05 12:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册