Catel帮助手册-Catel.Core:(5)依赖注入(ServiceLocator and TypeFactory)

1,简介

在Catel2.0之前,IOC容器内部使用的是Unity,然而,这就强制所有的用户在他的应用程序中使用Unity作为IOC容器,也需要这样划分库,从2.0以后,一个不同的技术被使用了,这个允许开发者可以使用他们自己悬着的IOC容器技术。

1.1在Ioc中不同的组件

在Catel中有许多不同的组件他们对于Ioc是非常重要的。

ServiceLocator
该组件用于注册所有的类型,这个事真正的Ioc容器

TypeFactory
用于创建类型的组件,使用IServiceLocator来获取需要视力的类型

DependencyResolver
IServiceLocator的轻量级实现,这个并不暴露注册方法,只是允许resolve类型

 

1.2 为任意对象获取组件

在每个对象中,可以使用默认属性来获取每个组件的实例,这在不同的scoping被使用时会造成问题,要确定为你工作的正确对象,需要使用如下的扩展代码。

using Catel.IoC; // Contains ObjectExtensions which allow use of below extension methods

public class MyService
{
    public void SomeMethod()
    {
        // If you need to create a type with the current scope type factory
        var typeFactory = this.GetTypeFactory();

        // If you need to register a type with the current scope service locator
        var serviceLocator = this.GetServiceLocator();

        // If you need to resolve a type with the current scope and the type is not injected via dependency injection
        var dependencyResolver = this.GetDependencyResolver();
    }
}

 

2.IOC组件的说明

2.1 ServiceLocator说明

ServiceLocator在Catel中作为服务容器。

内部使用TypeFactory作为服务的初始化。

Catel uses it‘s own ServiceLocator implementing the IServiceLocator to gather all services required by Catel.

例如, IPleaseWaitService和IUIVisualizerService为默认服务,在通常情况下,当第一个view model在初始之前,Catel已经注册了所有的立即可以用的默认服务,这个可以让开发者可以在view model被初始之前注册自己的实现的服务(例如,应用程序启动服务)。

    ServiceLocator可以被实例化,但是Catel会实例化一个进程,在同一个AppDomain中的所有对象之间共享,ServiceLocator可以通过ServiceLocator获取。

 注意:如果要知道类型如何被初始化和依赖注入的,可以查看后面的TypeFactory的说明。

2.2 注册一个类型

使用如下的代码注册一个指定的类型到ServiceLocator

 

ServiceLocator.Default.RegisterInstance<IPleaseWaitService>(pleaseWaitService);

2.3 注册一个晚绑定类型

ServiceLocator.Default.RegisterType<IPleaseWaitService>(x => new PleaseWaitService());

 

2.4 注册一个类型的实例

当对象第一次被resolve的时候,Catel使用TypeFactory或者Activator.CreateInstance来创建实例,但是有时候,一个服务的构造函数需要参数或者需要很长的时间来构造,在这种情况下,推荐人工来创建类型和注册实例

var pleaseWaitService = new PleaseWaitService();
ServiceLocator.Default.RegisterInstance<IPleaseWaitService>(pleaseWaitService);

 

2.5 通过MissType事件来注册一个类型

当一个类型没有注册到ServiceLocato或者其他任何容器中,ServiceLocator会给一用户痛一个最后的注册信息。记录履历的事件是非常有用的(开发者可以通过履历知道那什么类型从IOC容器中丢失了),或者他能决定服务在后期必须被使用,

The ServiceLocator gives the end-developer a last-resort chance to register a type when it is not registered in the ServiceLocator or any of the external containers. This event is very useful for logging (then the developer in the log knows exactly what type is missing from the IoC container) or it can be used to determine at runtime in a very late stage what implementation of the service must be used. To register a type via the event, subscribe to the event and then use the following code:

private void OnMissingType(object sender, MissingTypeEventArgs e)

{

if (e.InterfaceType == typeof(IPleaseWaitService))

{

// Register an instance

e.ImplementingInstance = new PleaseWaitService();

// Or a type

e.ImplementingType = typeof(PleaseWaitService);

}

}

If both the ImplementingInstance and ImplementingType are filled, the ImplementingIntance will be used.

Resolving a type

To retrieve the implementation of a service, use the following code:

var pleaseWaitService = ServiceLocator.Default.ResolveType<IPleaseWaitService>();

时间: 2024-12-10 20:33:11

Catel帮助手册-Catel.Core:(5)依赖注入(ServiceLocator and TypeFactory)的相关文章

Catel帮助手册-Catel.Core(6):日志管理

1,简介      从2.2版本开始,Catel使用了一个自定义的日志系统,这种方式,针对log4net的引用可以被移除,做这个修改主要是为了不强迫用户使用log4net,同时,log4net看起来很长时间不更新了,其他的日志系统如NLog看起来在增长,新的日志系统将允许许多基础的日志,这样,日志将将非常简单,并且如果他需要,真正的日志将被用户执行. 1.1 Log和ILog      所有的日志将通过ILog接口.这个接口被自动的注册到Catel中的所有对象上作为Log字段,ILog接口仅仅有

.Net Core 使用依赖注入

ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的ConfigureServices(IServiceCollection services)方法中,通过IServiceCollection接口注入就行. 通过接口的Add*方法进行注册,代码如下: ASP.NET Core runtime帮忙注册如下方法 // This method gets c

用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net core 迁移工作,asp.net 项目与 asp.net core 项目并存,为了避免两种类型项目的缓存冲突,我们分别用了 2 台不同的 memcached 服务器. 之前使用 1 台 memcached 服务器时,只需要一个客户端,所以只需创建一个 MemcachedClient 单例并注入到 IM

【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依赖注入后,你的编程思维就得变一变了.在过去,许多功能性的类型(比如一个加密解密的类),我们都喜欢将其定义为静态(static),而有了依赖注入,你就要避免使用静态类型,应该交由服务容器帮你管理,只要你用好了,你会发现依赖注入是很方便的. 依赖注入的初级玩法,也是比较标准的玩法,此种玩法有两种模式:

net core WebApi——依赖注入Autofac

目录 前言 Autofac 添加一个Util来随时调用 小结 代码地址 预告 前言 周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了. Autofac 这个第三方类库呢,是Ioc的容器,可以简化我们很大的工作量,比如说在之前我们需要写个类去声明接口与实现,而用了这个容器呢,就不需要了,当然还是需要些配置的. 首先,引入第三方类库,不多说. 然后开始配置吧,首

.NET Core 中依赖注入 AutoMapper 小记

最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式 services.AddSingleton<IMapper>(new Mapper(new MapperConfiguration(cfg => { cfg.CreateMap<User, MentionUserDto>(); }))); 于是趁机学习了解一下,在 github 上发现了 A

Catel帮助手册-Catel.Core:(4)数据处理

1,概要      文档的这个部分都是关于Catel中数据处理方法的,一些部分是基于CodeProject上的文章的,但这个文档有更多的更新内容.     一件很重要的事情是许多开发者花费很多时间来处理对象的序列化,序列化是一个专业领域的知识,只有技术比较高深的人员才能很好地掌握对象的序列化处理(要考虑程序集的改变,类的改变(属性的增加和移除),大部分开发者认为序列化只是执行如下的操作代码创建一个BinaryFormattter对象: var serializer = new BinaryFor

Catel帮助手册-Catel.Core:(2)缓存处理

      缓存是用于提供应用程序执行效率的,应用程序大部分的花费都用于数据的获取,这些处理主要移动到网络上或者存储到硬盘中,但是某些数据不太会改变,并不需要每次都同步.     因此,为了提高应用程序的执行效率,找到一个很好的方法来处理这些不太改变的数据库,Catel使用了一个 CatchStorage<TKey,TValue>的类,注意,第一个泛型的参数表示的是关键字的类型,第二个泛型的参数是要存储的值的类型,就像Dictonary<Tkey,TValue>.但是CatcheS

Catel帮助手册-Catel.Core:(1)参数检查

  我们检查方法是否正确,一般是返回对错,或者是是否抛出一个异常,大部分人不检查异常的正确性,那么这种错误在很深的堆栈中,很难查看. Catel与一般的检查方法不同,一般是使用   public void CheckForException(object obj) { if (obj == null) { throw new ArgumentNullException("obj"); } }   然而,Catel会记录所有的行为,因此开始的检查方式如下: public void Che