中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

WCF利用企業(yè)庫Unity框架的IOC層次解耦-創(chuàng)新互聯(lián)

由于工作幾個月來框架開發(fā)已經(jīng)好久沒寫博客了,今天想抽點時間出來冒泡。在領域驅動開發(fā)中SOA已經(jīng)成為我們開發(fā)的主流技術,在面對當前眾多的UI框架選擇(asp.net mvc,silverlight,wpf,winform,wp7等一些列甚至跨語言),我們能夠重用和抽象的業(yè)務邏輯是不會變化的,為了屏蔽這些UI的復雜性和差異性,我們可能會采用諸如wcf soap的服務發(fā)布。再說在領域驅動開發(fā)中我們肯定會把各個邏輯分層次隔離解除耦合,這就出現(xiàn)了N層架構,在于我們的每一層次之間的耦合度當前流程的解決方案IOC框架,以及業(yè)務解耦AOP。這里要解決的是SOA框架WCF和IOC框架的結合。

創(chuàng)新互聯(lián)是一家專業(yè)提供疊彩企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設H5建站、小程序制作等業(yè)務。10年已為疊彩眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

   WCF框架是一個極易擴展的框架,提供了非常多的擴展點(InstanceProvider,MessageInspector,CallContextInitializer,MessageFilter,MessageFormatter,ParameterInspector等等)。在這里IOC是作為一個容器組裝創(chuàng)建的框架,我們需要的是對服務對象的創(chuàng)建,所以我們選擇的當然是InstanceProvider擴展點。

    多說一句廢話,正如前篇利用Attribute簡化Unity框架IOC注入和 AOP之PostSharp7-解決IOC 不能直接new問題,簡化IOC開發(fā)和IOC對象LazyLoad中所說,我是一個固執(zhí)的人,個人希望注入支持自定義配置文件,不喜歡把配置信息全部寫在一個web.config/app.config中,也不喜歡el的寫在同一個外部配置文件中,傾向于每個模塊在一個不同的配置文件,并在模塊中在區(qū)分container容器,所以特別寫了每個單獨配置文件的延時加載,緩存。

     下面就是對InstanceProvider的擴展:

  1. View Code   
  2.  
  3. public class ELUnityInstanceProvider : IInstanceProvider   
  4.    {   
  5.        private Type contractType;   
  6.        private string container;   
  7.        private string configFile;   
  8.        private string name;   
  9.        private static object lockObj = new object();   
  10.        private static Dictionary<string, UnityConfigurationSection> sectionDict = new Dictionary<string, UnityConfigurationSection>();   
  11.  
  12.        public ELUnityInstanceProvider(Type contractType, string container, string configFile, string name)   
  13.        {   
  14.            this.name = name;   
  15.            this.configFile = configFile;   
  16.            this.contractType = contractType;   
  17.            this.container = container;   
  18.        }   
  19.  
  20.        #region IInstanceProvider 成員   
  21.  
  22.        public object GetInstance(System.ServiceModel.InstanceContext instanceContext, System.ServiceModel.Channels.Message message)   
  23.        {   
  24.            Microsoft.Practices.Unity.Configuration.UnityConfigurationSection unitySection = GetUnityConfigurationSection();   
  25.  
  26.            if (unitySection != null)   
  27.            {   
  28.                var container = new Microsoft.Practices.Unity.UnityContainer().LoadConfiguration(unitySection, string.IsNullOrEmpty(this.container) ? unitySection.Containers.Default.Name : this.container);   
  29.                var obj = string.IsNullOrEmpty(this.name) ? container.Resolve(this.contractType) : container.Resolve(this.contractType, this.name);   
  30.  
  31.                var piabAtttr = obj.GetType().GetCustomAttributes(typeof(ELPolicyinjectionAttribute), false) as ELPolicyinjectionAttribute[];   
  32.                if (piabAtttr.Length > 0)   
  33.                {   
  34.                    obj = Microsoft.Practices.EnterpriseLibrary.PolicyInjection.PolicyInjection.Wrap(this.contractType, obj);   
  35.                }   
  36.                return obj;   
  37.            }   
  38.            return null;   
  39.        }   
  40.        private Microsoft.Practices.Unity.Configuration.UnityConfigurationSection GetUnityConfigurationSection()   
  41.        {   
  42.            if (!string.IsNullOrEmpty(this.configFile))   
  43.            {   
  44.                if (!sectionDict.ContainsKey(this.configFile))   
  45.                {   
  46.                    lock (lockObj)   
  47.                    {   
  48.                        if (!sectionDict.ContainsKey(this.configFile))   
  49.                        {   
  50.                            Microsoft.Practices.Unity.Configuration.UnityConfigurationSection unitySection = null;   
  51.                            var fileMap = new System.Configuration.ExeConfigurationFileMap { ExeConfigFilename = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, this.configFile) };   
  52.                            System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);   
  53.                            unitySection = configuration == null ? null : configuration.GetSection(Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.SectionName) as Microsoft.Practices.Unity.Configuration.UnityConfigurationSection;   
  54.                            if (unitySection == null)   
  55.                                return null;   
  56.                            sectionDict.Add(this.configFile, unitySection);   
  57.                        }   
  58.                    }   
  59.                }   
  60.                return sectionDict[this.configFile];   
  61.            }   
  62.  
  63.            return System.Configuration.ConfigurationManager.GetSection(Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.SectionName) as Microsoft.Practices.Unity.Configuration.UnityConfigurationSection;   
  64.  
  65.        }   
  66.  
  67.        public object GetInstance(System.ServiceModel.InstanceContext instanceContext)   
  68.        {   
  69.            return this.GetInstance(instanceContext, null);   
  70.        }   
  71.  
  72.        public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object instance)   
  73.        {   
  74.            IDisposable disposable = instance as IDisposable;   
  75.            if (disposable != null)   
  76.            {   
  77.                disposable.Dispose();   
  78.            }   
  79.            instance = null;   
  80.        }   
  81.  
  82.        #endregion   
  83.    }  
  84. 復制代碼 

下面我們需要已Attribute方式貼在Contract上:

  1. View Code   
  2.  
  3. public class ELUnityBehaviorAttribute : Attribute, IContractBehavior   
  4.    {   
  5.        public string Container   
  6.        {   
  7.            get;   
  8.            set;   
  9.        }   
  10.  
  11.        public string ConfigFile   
  12.        {   
  13.            get;   
  14.            set;   
  15.        }   
  16.  
  17.        public string Name   
  18.        {   
  19.            get;   
  20.            set;   
  21.        }   
  22.  
  23.        #region IContractBehavior 成員   
  24.  
  25.        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)   
  26.        {   
  27.  
  28.        }   
  29.  
  30.        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)   
  31.        {   
  32.  
  33.        }   
  34.  
  35.        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime)   
  36.        {   
  37.            dispatchRuntime.InstanceProvider = new ELUnityInstanceProvider(contractDescription.ContractType, this.Container, this.ConfigFile, this.Name);   
  38.        }   
  39.  
  40.        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)   
  41.        {   
  42.        }   
  43.  
  44.        #endregion   
  45.    }  
  46. 復制代碼  
  47.    

    對于wcf同時我們也該支持配置文件擴展:

  1. View Code   
  2.  
  3. public class ELUnityBehaviorElement : BehaviorExtensionElement   
  4.    {   
  5.        [ConfigurationProperty("Container", IsRequired = false, DefaultValue = "")]   
  6.        public string Container   
  7.        {   
  8.            get;   
  9.            set;   
  10.        }   
  11.  
  12.        [ConfigurationProperty("ConfigFile", IsRequired = false, DefaultValue = "")]   
  13.        public string ConfigFile   
  14.        {   
  15.            get;   
  16.            set;   
  17.        }   
  18.  
  19.        [ConfigurationProperty("Name", IsRequired = false, DefaultValue = "")]   
  20.        public string Name   
  21.        {   
  22.            get;   
  23.            set;   
  24.        }   
  25.  
  26.        protected override object CreateBehavior()   
  27.        {   
  28.            return new ELUnityBehavior(this.Container, this.ConfigFile, this.Name);   
  29.        }   
  30.  
  31.        public override Type BehaviorType   
  32.        {   
  33.            get { return typeof(ELUnityBehavior); }   
  34.        }   
  35.    }  
  36.  
  37. public class ELUnityBehavior : IEndpointBehavior   
  38.    {   
  39.        public string Container   
  40.        {   
  41.            get;   
  42.            set;   
  43.        }   
  44.  
  45.        public string ConfigFile   
  46.        {   
  47.            get;   
  48.            set;   
  49.        }   
  50.  
  51.        public string Name   
  52.        {   
  53.            get;   
  54.            set;   
  55.        }   
  56.  
  57.        public ELUnityBehavior(string container, string configFile, string name)   
  58.        {   
  59.            this.Name = name;   
  60.            this.ConfigFile = configFile;   
  61.            this.Container = container;   
  62.        }   
  63.        #region IEndpointBehavior 成員   
  64.  
  65.        public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)   
  66.        {   
  67.  
  68.        }   
  69.  
  70.        public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)   
  71.        {   
  72.  
  73.        }   
  74.  
  75.        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)   
  76.        {   
  77.            endpointDispatcher.DispatchRuntime.InstanceProvider = new ELUnityInstanceProvider(endpoint.Contract.ContractType, this.Container, this.ConfigFile, this.Name);   
  78.        }   
  79.  
  80.        public void Validate(ServiceEndpoint endpoint)   
  81.        {   
  82.  
  83.        }   
  84.  
  85.        #endregion   
  86.    }  
  87. 復制代碼 

目前我們已經(jīng)簡單實現(xiàn)了:看看測試:

  1. View Code   
  2.  
  3. Contract:  
  4.  
  5.    [ServiceContract()]   
  6.    [Green.WCFExtensions.ELUnityBehavior(Container = "test", ConfigFile = "App1.config")]     
  7.   public interface IHelloService   
  8.   {   
  9.       [OperationContract]   
  10.       string Say(string name);   
  11.   }  
  12.  
  13. Service:  
  14.  
  15. public class HelloService1 : IHelloService   
  16.    {   
  17.        [Microsoft.Practices.Unity.Dependency("proxy")]   
  18.        public IHelloService Service   
  19.        {   
  20.            get;   
  21.            set;   
  22.        }   
  23.  
  24.        #region IHelloService 成員   
  25.           public string Say(string name)   
  26.        {   
  27.                      return Service.Say(name);   
  28.  
  29.        }   
  30.  
  31.        #endregion   
  32.    }   
  33.  
  34.    public class HelloServiceProxy : IHelloService   
  35.    {   
  36.        #region IHelloService 成員   
  37.        public string Say(string name)   
  38.        {   
  39.            return string.Format("Hello:{0}", name);   
  40.        }   
  41.  
  42.        #endregion   
  43.    }  
  44. 復制代碼 

配置app1.config:

<register type="WcfService.IHelloService,WcfService" mapTo="WcfService.HelloServiceProxy,WcfService"  name="proxy"> </register>
<register type="WcfService.IHelloService,WcfService" mapTo="WcfService.HelloService1,WcfService" > </register>

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。

新聞標題:WCF利用企業(yè)庫Unity框架的IOC層次解耦-創(chuàng)新互聯(lián)
當前網(wǎng)址:http://www.rwnh.cn/article26/cciojg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、網(wǎng)站設計做網(wǎng)站、標簽優(yōu)化網(wǎng)頁設計公司、營銷型網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設
崇文区| 马鞍山市| 鸡西市| 河源市| 右玉县| 芮城县| 南昌县| 东宁县| 蚌埠市| 长春市| 名山县| 建昌县| 丹寨县| 张家川| 楚雄市| 修武县| 乌拉特前旗| 札达县| 中超| 屏边| 清新县| 融水| 方城县| 长丰县| 南靖县| 上饶县| 景泰县| 广州市| 平陆县| 云阳县| 乡宁县| 宁国市| 桂阳县| 长岭县| 财经| 惠东县| 临沧市| 油尖旺区| 高雄市| 扎鲁特旗| 宾阳县|