统一容器使用笔记

  

1,配置文件团结容器使用笔记“> <br/>说明:此处有两个容器的节点,用来分别初始化两个容器,可以应对需要注入两个dbContext的情况。<br/>代码:<br/> & lt; configuration> <br/> & lt; configSections> <br/> & lt;部分name=皍nity & lt;/configSections>
& lt; unity>
& lt; sectionExtension类型=癕icrosoft.Practices.Unity.InterceptionExtension.Configuration。InterceptionConfigurationExtension Unity.Interception.Configuration"/祝辞
& lt; containers>
& lt;容器名称=皔ydyoaSection"在
& lt;扩展类型=癐nterception"/祝辞
& lt;注册类型=癝tudy.Unity.Interface.IDoWork, Study.Unity"mapTo=?Study.Unity.Service.StudentDoWork Study.Unity"在
& lt;拦截器类型=癐nterfaceInterceptor"/祝辞
& lt; interceptionBehavior类型=癝tudy.Unity.Aop.ParameterCheckBehavior, Study.Unity"/祝辞
& lt; interceptionBehavior类型=癝tudy.Unity.Aop.CachingBehavior, Study.Unity"/祝辞
& lt; interceptionBehavior类型=癝tudy.Unity.Aop.ExpessionBehavior, Study.Unity"/祝辞
& lt; interceptionBehavior类型=癝tudy.Unity.Aop.LogBeforeBehavior, Study.Unity"/比;
& lt;/register>
& lt;/container>
& lt;容器名称=癿anagerSection"在
& lt;扩展类型=癐nterception"/祝辞
& lt;注册类型=癝tudy.Unity.Interface.IDoWork, Study.Unity"mapTo=?Study.Unity.Service.TeacherDoWork Study.Unity"在
& lt;拦截器类型=癐nterfaceInterceptor"/祝辞
& lt;/register>
& lt;/container>
& lt;/containers>
& lt;/unity>
& lt;/configuration>

  

2,初始化容器
说明:创建了一个枚举,用来对应配置文件中的两个节点,然后通过扩展方法获取到枚举值在配置文件中的节点名称,用来分别初始化不同的容器。
代码:
容器的工厂:

  
 <代码> DIFactory公共类
  {
  私有静态只读的对象_SyncHelper=新对象();
  私有静态稳定Dictionary_UnityContainerDictionary=new Dictionary ();
  
  公共静态IUnityContainer GetContainer (EnContainer EnContainer)
  {
  如果(! _UnityContainerDictionary.ContainsKey (enContainer))
  {
  锁(_SyncHelper)
  {
  如果(! _UnityContainerDictionary.ContainsKey (enContainer))
  {//配置UnityContainer
  IUnityContainer容器=new UnityContainer ();
  ExeConfigurationFileMap fileMap=new ExeConfigurationFileMap ();
  fileMap。ExeConfigFilename=Path.Combine (AppDomain.CurrentDomain。BaseDirectory +“CfgFiles \ \ Unity.Config”);
  配置配置=ConfigurationManager。OpenMappedExeConfiguration (fileMap ConfigurationUserLevel.None);
  UnityConfigurationSection configSection=(UnityConfigurationSection) configuration.GetSection (UnityConfigurationSection.SectionName);
  字符串strSection=enContainer.Speccn ();
  configSection。配置(容器,strSection);
  
  _UnityContainerDictionary。添加(enContainer、集装箱);
  }
  }
  }
  返回_UnityContainerDictionary [enContainer];
  }
  } 
  
 <代码>枚举: 
  公共enum EnContainer
 <代码>
  {
  [Speccn (“yydyoaSection”)]
  YYDYOA=1,
  [Speccn (“managerSection”)]
  经理=2
  } 
  
 <代码>特性: 
  
 <代码> [AttributeUsage (AttributeTargets。AllowMultiple=false,继承=true)]
  公共类SpeccnAttribute:属性
  {
  私人字符串Speccn{得到;设置;}
  公共SpeccnAttribute(字符串speccn)
  {
  这一点。Speccn=Speccn;
  }
  公共字符串GetSpeccn ()
  {
  返回this.Speccn;
  }
  } 
  
 <代码>扩展方法: 
  
 <代码> EnumExtend公共静态类
  {
  公共静态字符串Speccn (Enum enContainer)
  {
  型类型=enContainer.GetType ();
  FieldInfo字段=type.GetField (enContainer.ToString ());
  如果(field.IsDefined (typeof (SpeccnAttribute),真正的))
  {
  SpeccnAttribute SpeccnAttribute=(SpeccnAttribute) field.GetCustomAttribute (typeof (SpeccnAttribute));
  返回speccnAttribute.GetSpeccn ();
  }
  其他的
  {
  返回enContainer.ToString ();
  }
  }
  } 
  

3,接口和实现类的代码
接口:

  
 <代码> IDoWork公共接口
  {
  字符串显示(字符串参数);
  } 
  
 <代码>实现类: 
  
 <代码>公共类StudentDoWork: IDoWork
  {
  公共字符串显示(string参数)
  {
  Console.WriteLine”($ {this.GetType ()。名称}_DoWork之前”);
  Console.WriteLine”($ {this.GetType ()。名称}_DoWork后”);
  返回nameof (StudentDoWork);
  }
  }
  
  公开课TeacherDoWork: IDoWork
  {
  公共字符串显示(string参数)
  {
  ”Console.WriteLine ($ {this.GetType () . name} _DoWork”);
  返回nameof (TeacherDoWork);
  }
  }

统一容器使用笔记