寫在前面: 第一次配置時好好的,後來第二次改到MVC模式,把依賴註入寫成字典的單例模式時,由於新建的ORM(資料庫映射模型EF),怎麼弄都不用,一直報錯"No connection string named '**Context' could be found in the application ...
寫在前面: 第一次配置時好好的,後來第二次改到MVC模式,把依賴註入寫成字典的單例模式時,由於新建的ORM(資料庫映射模型EF),怎麼弄都不用,一直報錯"No connection string named '**Context' could be found in the application config file"(配置文件中找不到資料庫context連接)調試了兩小天問題,終於想到了是沒有把EF模型中appconfig中的資料庫連接複製到項目webconfig中導致的!!!改過之後果然好了,豁然開朗!
中間也發現了一個小的點:調試的時候因為配置有問題,就改成不用配置直接寫的方式:(如下)
UnityContainer container = new UnityContainer(); container.RegisterType<DbContext, JDContext>(); container.RegisterType<IBaseService, BaseService>(); container.RegisterType<IUserMenuService, UserMenuService>(); IBaseService baseService = container.Resolve<IBaseService>(); IUserMenuService userservice = container.Resolve<IUserMenuService>(); JD_User a = userservice.Set<JD_User>().FirstOrDefault();
然後就報錯BaseService是抽象類 不能實例化。 後來發現 這句不需要寫出來
IBaseService baseService = container.Resolve<IBaseService>();
因為 IUserMenuService 繼承了 IBaseService 實現IUserMenuService的時候自然就把基類帶出來了實現了。
困惑了一天半 終於解決了。
以下是DI工廠實現
namespace Common { public class DIFactory { private static object _syncHelper = new object(); private static Dictionary<string, IUnityContainer> _UnityContainerDic = new Dictionary<string, IUnityContainer>(); public static IUnityContainer GetContainer(string containerName = "JDContainer") { if (!_UnityContainerDic.ContainsKey(containerName)) { lock (_syncHelper) { if (!_UnityContainerDic.ContainsKey(containerName)) { IUnityContainer container = new UnityContainer(); ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config.xml"); Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); section.Configure(container, containerName); _UnityContainerDic.Add(containerName, container); } } } return _UnityContainerDic[containerName]; } } }
以下是unity文件配置 (即上文代碼中的 Unity.Config.xml )
<configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration"/> <containers> <container name="JDContainer"> <!--<register type="Interface.ITest, Interface" mapTo="Service.Test, Service" />--> <register type="System.Data.Entity.DbContext, EntityFramework" mapTo="EF.Model.JDContext, EF.Model"/> <register type="Interface.IBaseService, Interface" mapTo="Service.BaseService, Service" /> <register type="Interface.IUserMenuService, Interface" mapTo="Service.UserMenuService, Service" /> </container> <!--<container name="testContainer"> <register type="Interface.ITest, Interface" mapTo="Service.Test, Service" /> <register type="System.Data.Entity.DbContext, EntityFramework" mapTo="EF.yuncaidbEntities, EF"/> <register type="Interface.IBaseService, Interface" mapTo="Service.BaseService, Service" /> <register type="Interface.IUserService, Interface" mapTo="Service.UserService, Service" /> </container>--> </containers> </unity> </configuration>