当前位置: 首页 > news >正文

顺义区做网站网站推广现状

顺义区做网站,网站推广现状,seo推广优化平台,阿里云上的网站建设Ninject学习笔记#xff08;一#xff09; Ninject学习笔记#xff08;一#xff09;理解依赖注入DI概念什么是DI#xff1f;DI是如何工作的#xff1f;什么是DI容器使用Ninject如何使用NinjectNinject对象生命周期暂时范围单例范围线程范围请求范围自定义范围Ninject模块… Ninject学习笔记一 Ninject学习笔记一理解依赖注入DI概念什么是DIDI是如何工作的什么是DI容器使用Ninject如何使用NinjectNinject对象生命周期暂时范围单例范围线程范围请求范围自定义范围Ninject模块从xml配置依赖Ninject XML扩展Ninject约定Ninject Convention扩展选择程序集选择组件选择服务类型绑定配置 理解依赖注入 DI概念 依赖注入或者控制反转降低代码耦合度。Ninject是一个轻量级.NET DI框架。 什么是DI 一个例子木匠伐木需要工具斧子。 class Carpenter{ Axe axe new Axe(); void Lumber() { axe.Cut(); }} 代码中木匠依赖于斧子。此时需求变了木匠买了木锯那么上面的代码必须从新修改然后进行编译。再比如木匠比较爱惜工具决定两种工具换着用再比如木匠决定提高生产率购置了电锯等等。作为程序员来说如果每次需求变更就重新编码那么你会发现自己深陷沼泽地。 DI的出现就是为了解决这一问题的。它是一种编程方式依赖关系不需要调用者来管理统一由框架管理。“不要找我们我们来找你”。 DI是如何工作的 简简单单一句话——对接口编程而不是对具体实现编程。用抽象元素来实现依赖而不是具体类如此一来我们可以很容易地替换具体的依赖类而不影响上层的调用组件。 class ITool{ void Cut();}class Carpenter{ private ITool tool; void Carpenter(ITool tool) { tool tool; } void Lumber() { tool.Cut(); }} 什么是DI容器 DI容器是一个注入对象用来向对象注入依赖性。一个应用中的依赖关系组成一个错综复杂的依赖图。DI容器就是来管理依赖复杂性的。它决定抽象类选择哪个实现类来实例化对象。Ninject有两种定义依赖的方式 xml配置bind serviceITool toAxe/代码定义Bind().To()使用Ninject 如何使用Ninject 在VS编辑环境中-右键项目-选择Nuget管理器-搜索Ninject-下载在项目中定义Kernel:var kernel new StandardKernel()通过kernel.Get方法获取依赖的对象。Ninject对象生命周期 暂时范围 默认状态Ninject不管理它创建的对象也就是每次请求都new一个新对象。 单例范围 有两种方式创建单例 使用单例模式class ConsoleLogger:ILogger{ public static readonly ConsoleLogger Instance new ConsoleLogger(); private static ConsoleLogger() { // Hiding constructor } public void Log(string message) { Console.WriteLine({0}: {1}, DateTime.Now, message); }} 然后在Bind方法后调用ToConstant方法指定静态只读对象ConsoleLogger.Instance为常量对象。 kernel.BindILogger().ToConstant(ConsoleLogger.Instance); 使用InSingletonScope方法——更简单的方法 kernel.BindILogger().ToConsoleLogger().InSingletonScope();指定某个类为单例 kernel.BindConsoleLogger.ToSelf().InThreadScope();线程范围 每一个线程只创建一个给定类型的对象。对象的生命周期和线程一样长。 kernel.Bindobject().ToSelf().InThreadScope(); 请求范围 用在Web应用程序中非常有用。在相同的请求范围内得到一个单例的对象。需要添加Ninject.Web.Common引用。 kernel.BindSampleClass().ToSelf().InRequestScope(); 自定义范围 自定义范围让我们定义我们自己的范围在这个范围内保持一类型的唯一对象。只要提供的回调方法返回的对象引用是一样的Ninject在这个范围内返回相同的实例。只要返回的对象引用变了将创建一新的指定类型的对象。创建的对象实例将一直保存在缓存里直到返回的范围对象被垃圾回收器回收。一旦范围对象被垃圾回收器回收Ninject创建的所有的对象实例将被从缓存中释放和处理。 调用InScope方法传入Lamda表达式定义自定义返回kernel.Bindobject().ToSelf().InScope( ctx User.Current ); 自定义范围是最灵活的可以实现其他的范围 线程范围kernel.Bindobject().ToSelf().InScope( ctx Thread.CurrentThread);请求范围kernel.Bindobject().ToSelf().InScope( ctx HttpContext.Current);Ninject模块 如果应用程序规模比较大那么注册的服务列表将会非常长维护变得困难。一种好的方式是进行分组管理。Ninject提供了这个功能。每个组称为一个Ninject模块只需要编写一个类实现INinjectModule接口需要实现三个方法和两个属性。好消息是Ninject还提供了一个实现该接口的抽象类NinjectModule无需每次都实现接口的所有方法。 将多个模块加载到单个Ninject Kernel中的方法 var kernel new StandardKernel(new Module1(), new Module2(), ...) 也可以将应用程序中所有的模块同时加载到Ninject Kernel中 kernel.Load(AppDomain.CurrentDomain.GetAssemblies()); 从xml配置依赖Ninject XML扩展 需要Ninject XML扩展引用。注意记得发布xml文件时选择“Copy if newer”。 XML配置文件格式如下 module namemoduleName  bind serviceNamespace.IService1, AssemblyName    toNamespace.ConcreteService1, AssemblyName /  bind serviceNamespace.IService2, AssemblyName    toNamespace.ConcreteService2, AssemblyName    Scopesingleton//module 加载XML文件到Kernel的方法 kernel.Load(module1.xml,module2.xml,module3.xml); 可以使用相对输出路径的路径也可以使用绝对路径还可以使用通配符 kernel.Load(Modules/*.xml); Ninject约定Ninject Convention扩展 小的应用中一个一个注册服务类型并不困难但是一个有上百个服务的应用程序呢约定配置允许我们绑定一组服务而不是一个个分别绑定。 注册一个约定绑定需要三个步骤选择包含具体类的程序集、选择程序集中的具体组件、选择具体组件相关的服务类型。 选择程序集 FromThisAssembly():选择包含当前代码的程序集From(params Assembly[] assemblies):选择指定程序集FromAssemblyContainingSomeType():选择包含指定类的程序集Join()选择多个程序集。kernel.Bind(x x.FromAssemblyContainingCustomersService().SelectAllClasses().Join().FromAssemblyContainingMessageProvider().SelectAllClasses().BindAllInterfaces()); 默认情况下只有公有类型可以在程序集中被邦迪。为包含非公有类型需要在选择程序集后显式调用IncludingNonePublicTypes方法 kernel.Bind(x x.FromAssemblyContainingCustomersService().IncludingNonePublicTypes().SelectAllClasses().BindAllInterfaces()); 选择组件 选择要注册的组件。 SelectAllClasses()选择所有的非抽象类SelectFuncType, bool filter:选择需要的类。 例子选择以“Customer开头的所有类kernel.Bind(r r.FromThisAssembly().Select(t t.Name.StartsWith(Customer)).BindBase()); 例子用条件对结果进行过滤 kernel.Bind(x x.FromThisAssembly().SelectAllClasses().InNamespaces(Northwind.Controllers).BindBase()); 选择服务类型 BindAllInterfaces(): 绑定所有的选择的组件的接口到选择的组件。BindBase(): 绑定选择的组件的基类型到当前的组件。BindDefaultInterface(): 绑定指定类型的默认接口到类型。类型的默认接口跟类型同名。例如ICustomerService是CutomerService的默认接口。BindDefaultInterfaces(): 绑定指定类型的默认接口到类型。类型的默认接口是那些以类型的名字结尾的接口。例如IRepository和ICustomerRepository都是SqlCustomerRepository的默认接口。BindSingleInterface(): 要求指定类型只有一个接口。在这个情况下这个接口绑定到这个类型。如果这个类型没有或者有多个接口则不添加绑定。BindToSelf(): 绑定类型到自身。BindSelection(ServiceSelector selector): 绑定选择的接口到类型。BindUsingRegex(string pattern): 绑定当前类型的符合正则表达式的接口到类型。绑定配置 绑定创建后可以像普通绑定的配置一样进行配置 kernel.Bind(x x.FromThisAssembly().SelectAllClasses().BindAllInterfaces().Configure(bb.InSingletonScope())); 我们也可以使用ConfigureFor方法对某些类型分别进行配置。下面的例子所有的repository类在构造函数中都注入connectionString参数配置成单例生命周期。SqlCustomerRepository类重载成线程生命周期 kernel.Bind(x x.FromThisAssembly().SelectAllClasses().InheritedFromIRepository().BindAllInterfaces().Configure(b b.InSingletonScope ().WithConstructorArgument(connectionString, ApplicationSettings.ConnectionString)).ConfigureForSqlCustomerRepository(b b.InThreadScope()));null转载于:https://www.cnblogs.com/qianzi067/p/6594463.html
http://www.zqtcl.cn/news/654817/

相关文章:

  • 网站图片处理方案动漫制作这个专业怎么样
  • 做写手哪个网站好黄页网站建设黄页网站建设
  • 多语言企业网站免费模板网站哪个好
  • 拟一份饰品网站建设合同襄樊门户网站建设
  • 你对网站第一印象受欢迎的广州做网站
  • 网站开发项目的需求分析浙江省城乡建设网站证件查询
  • 整站seo定制简单 大气 网站模版
  • 网站界面设计策划书怎么做云匠网订单多吗
  • html教程 pdf网站建设优化兰州
  • 招聘网站可以同时做两份简历吗外贸网站示例
  • 黑链 对网站的影响企业融资计划书范本
  • 自己的简历怎么制作网站学院网站建设成效
  • 周口seo 网站郑州建站网站的公司
  • 网站布局模板北京装修大概多少钱一平方
  • 德阳网站建设ghxhwl风景网站模板
  • 昌邑网站建设拓者设计吧现代效果图
  • 学校网站建设成功案例网站开发需要学习哪些内容
  • 怎么让公司建设网站seo于刷网站点击
  • 网站建设合同严瑾建设网站宣传
  • 哪个网站做餐饮推广最好深圳市信任网站
  • 网站模板 整站源码广州网站vi设计报价
  • 百度速页建站wordpress审核插件
  • 怎么给网站wordpress专业的vi设计公司
  • 百度关键词在线优化寻找郑州网站优化公司
  • 网站建设适合什么单位网络推广员工作内容
  • 漂亮的网站维护页面wordpress加个微信登录
  • 网站设计是什么意思创建地址怎么弄
  • nas上建设网站文章网站哪里建设好
  • 消防网站模板广告设计专业需要学什么
  • 建设银行网站首页wordpress 登录函数