国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Unity Container 應用示例

2019-11-17 02:17:05
字體:
來源:轉載
供稿:網友
Unity Container 應用示例

一 項目引用Unity

右鍵項目引用-> 管理Nuget包->搜索unity->安裝Unity 和 Unity Interception Extension,如下圖所示.

Image

二 創建基礎類

我們以商品查詢的數據層注入為例.

1.首先創建商品實體Model. 如果商品信息要被序列化,就要為該類添加Serializable特性.

public class PRoduct    {        public int Id { get; set; }        public string Name { get; set; }        public int Price { get; set; }        public override string ToString()        {            return string.Format(" Product id:{0}/r/n Name:{1}/r/n Price:{2}/r/n",Id,Name,Price);        }    }

2.創建數據層接口及其實現類.

public interface iproductDao    {        Product Get(int id);    }
public class ProductDao:IProductDao    {        public Product Get(int id)        {            #warning product info for test            return new Product()            {                Id = id,                Name = "Product"+id,                Price = id*10            };        }    }

3.直接創建實例

其實有了以上內容就可以調用查詢商品信息了.

static void Main( string[] args)         { IProductDao productDao= new ProductDao(); Product product = productDao.Get(5); Console.WriteLine(product.ToString()); Console.Read();         }

Image

不過在項目中使用這種方式的話,耦合度比較高.一旦想修改IProductDao的實現方式涉及到的地方就太多了. 使用Unity實現依賴注入可以降低耦合.

三.使用Unity實現依賴注入

1.創建Unity配置文件

<? xml version= "1.0 "?> < configuration>   < configSections>     <!-- unity程序集-->     < section name= "unity " type =" Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />   </ configSections>   < unity xmlns= "http://schemas.microsoft.com/practices/2010/unity ">     <!-- 程序集和命名空間 -->     < assembly name= "DemoCache "/>     < namespace name= "DemoCache.Dao "/>     < namespace name= "DemoCache.Dao.Impl "/>     < container name= "Dao ">       <!-- 商品 -->       < register type= "IProductDao " mapTo= "ProductDao "></ register>     </ container>   </ unity> </ configuration>

2.創建UnityContainerManager類

創建UnityContainerManager讀取Unity.config配置. 完整代碼見附件,重點看一下從Unity.config讀取配置信息的方法:

private IUnityContainer LoadUnityConfig()        {            ////根據文件名獲取指定config文件            string filePath = AppDomain.CurrentDomain.BaseDirectory + @"Configs/Unity.config";            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath };            //從config文件中讀取配置信息            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);            var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");            var container = new UnityContainer();            foreach (var item in unitySection.Containers)            {                container.LoadConfiguration(unitySection, item.Name);            }            return container;        }

3.調用示例

static void Main( string[] args)         { IProductDao productDao = UnityContainerManager .Instance.Resolve<IProductDao >(); Product product = productDao.Get(8); Console.WriteLine(product.ToString()); Console.Read();         }
Image

四 使用Unity Interception實現日志

1.創建ICallHandler接口實現類

新建類LogCallHandler類,實現接口ICallHandler. 每次調用相應方法時會自動將執行時間寫入日志.

public class LogCallHandler:ICallHandler    {        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)        {            //計時開始            var stopWatch = new Stopwatch();            stopWatch.Start();            //執行方法            IMethodReturn result = getNext()(input, getNext);            //計時結束            stopWatch.Stop();            //記錄日志            var argumentsSb = new StringBuilder(input.MethodBase.Name);            for (var i = 0; i < input.Arguments.Count; i++)            {                argumentsSb.AppendFormat("-{0}:{1}", input.Arguments.ParameterName(i), input.Arguments[i]);            }            LogHelper.LogInfo(string.Format("{2} 方法 {0},執行時間 {1} ms", argumentsSb, stopWatch.ElapsedMilliseconds,Msg));            return result;        }        public int Order { get; set; }        public string Msg { get; set; }    }

2.創建特性

創建特性LogTime,它需要實現HandlerAttribute.

public class LogTimeAttributes:HandlerAttribute    {        public int Order { get; set; }        public string Msg { get; set; }        public override ICallHandler CreateHandler(IUnityContainer container)        {            return new LogCallHandler()            {                Order = Order,                Msg = Msg            };        }    }

3.使用特性

[LogTimeAttributes (Order = 1,Msg = "查詢單個商品信息" )]

4.配置Unity.config

配置Unity Interception需要在unity節點下添加:

< sectionExtension 
type =" Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration ">
</ sectionExtension >

然后在container節點下添加:

< extension type= "Interception " />

最后調整IProductDao的注冊節點:

< register type= "IProductDao " mapTo= "ProductDao ">         < interceptor type =" InterfaceInterceptor" />         < policyInjection /> </ register>

調用處不用做調整,結果如下:

Image

5.不使用Unity.config配置文件

其實如果不走Unity.config配置文件,也可以直接在代碼中設置.

static void Main(string[] args)        {                    var container = new UnityContainer().AddNewExtension<Interception>().RegisterType<IProductDao, ProductDao>();            container.Configure<Interception>().SetInterceptorFor<IProductDao>(new InterfaceInterceptor());            IProductDao productDao = container.Resolve<IProductDao>();            Product product = productDao.Get(8);            Console.WriteLine(product);            Console.Read();        }

代碼: http://files.VEVb.com/files/janes/DemoCache.zip


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 周宁县| 改则县| 齐齐哈尔市| 密云县| 德庆县| 洛南县| 河南省| 辉南县| 扎赉特旗| 马鞍山市| 泸溪县| 东阿县| 萍乡市| 清涧县| 罗定市| 佛山市| 沧源| 纳雍县| 沂源县| 确山县| 铜山县| 海安县| 建始县| 海安县| 广水市| 大城县| 普宁市| 石家庄市| 霍州市| 浦北县| 建瓯市| 灵川县| 北安市| 和林格尔县| 庆安县| 城口县| 漾濞| 孟连| 九龙城区| 阳东县| 巴南区|