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,但这是我的全部了
<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”
非常非常感谢!已经能成功注册了!
另外我想进一步了解一下,为什么最后产生的结果会是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"/>
`2表示IBaseRepository接口有两个参数
一般IOC容器(autofac也类似)归根到底都差不多使用Emit反射做的(这里的反射不用担心性能),所以typeof可以得到类的标签信息
`2的出现,个人猜测有可能,是因为参数太多,“[]”不能明确标识有几个参数(多了自己看着也乱),所以用`2明确标识参数个数
Unity在xml中注册泛型应该是用"`",在键盘1号键左侧的那个按键。关于详情你可以百度。、