在很多 Ioc 容器中,当使用者向容器请求实现了某个契约类型 (Contract Type) 的服务时 (调用类似如下方法 container.Resolve(Type contractType)),如果该服务尚未注册,而且该契约类型符合某种约定,那么容器将会自动为将该契约类型创建一个注册项 (Registration),并将该注册项添加到容器中,然后使用该注册项创建一个服务实例并将其返回给使用者。

例如,在 asp.net 应用程序中,假设我们有这样一个约定“只要契约类型是具体引用类型(不是值类型/接口/抽象类型),而且派生自 Controller 类,框架便可将其自动注册到容器中”,那么我们就可以实现类似如下效果:

public class MyController : Controller
{ } // Create an instance of container
var container = new ObjectContainer(true);
var myController = container.Resolve<MyController>();

在上面的示例中,尽管 MyController 这个类型并未注册到容器,但由于它符合上述约定,因此容器可以自动为其构造一个对象实例并返回给调用者。实际上,这是一种称为“基于约定的配置/注册”的功能。通过这种功能,我们可以进一步减少与 Ioc 框架的耦合,同时可以更加灵活地配置要将哪些服务注册到容器中。

在 My.Ioc 中,我们通过自动注册规则 (IAutoRegistrationPolicy) 提供了类似的功能。请看下面的代码示例:

 using System;
using System.Diagnostics;
using My.Ioc;
using My.Ioc.Core;
using My.Ioc.Exceptions;
using My.Ioc.Lifetimes; namespace UnregisteredConcreteTypeResolution
{
public class AutoRegistrableClass
{
}
class CustomAutoRegistrationPolicy : IAutoRegistrationPolicy
{
#region IAutoRegistrationPolicy Member public bool ShouldRegister(Type concreteType)
{
return concreteType == typeof(AutoRegistrableClass);
} public ILifetimeProvider GetLifetimeProvider()
{
return new ContainerLifetimeProvider();
} #endregion
} class Program
{
static void Main(string[] args)
{
IObjectContainer container = new ObjectContainer(false);
AutoRegistrableClass instance;
try
{
instance = container.Resolve<AutoRegistrableClass>();
}
catch (Exception ex)
{
Debug.Assert(ex is ObjectBuilderNotFoundException);
} var option = new ContainerOption(false, new CustomAutoRegistrationPolicy());
container = new ObjectContainer(option); instance = container.Resolve<AutoRegistrableClass>();
Debug.Assert(instance != null); var instance2 = container.Resolve<AutoRegistrableClass>();
Debug.Assert(instance2 != null);
Debug.Assert(instance == instance2); Console.ReadLine();
}
}
}

在上述示例中,如果我们不显式指定自动注册规则 (IAutoRegistrationPolicy),容器默认不会提供自动注册/解析功能,因此,当我们运行到上述代码的第 38 行时,程序便会抛出异常。但当我们另外创建一个容器实例,并通过构造参数将自动注册规则 CustomAutoRegistrationPolicy 传递到新容器实例中之后,这时再来运行 instance = container.Resolve<AutoRegistrableClass>() 这行,便不会再出现异常了。

本文源码可从此处下载。

My.Ioc 代码示例——实现自动注册/解析的更多相关文章

  1. My.Ioc 代码示例——如何使用默认构造参数,以及如何覆盖默认构造参数

    在 Ioc 世界中,有些框架(例如 Autofac/NInject/Unity)支持传递默认参数,有些框架(例如 SimpleInjector/LightInjector 等)则不支持.作为 My.I ...

  2. My.Ioc 代码示例——使用观察者机制捕获注册项状态的变化

    在 My.Ioc 中,要想在服务注销/注册时获得通知,可以通过订阅 ObjectBuilderRegistered 和 ObjectBuilderUnregistering 这两个事件来实现.但是,使 ...

  3. My.Ioc 代码示例——利用 ObjectBuilderRequested 事件实现延迟注册

    在使用 Ioc 框架时,一般我们建议集中在一个称为 Composition Root(其含义请参见下面的小注)的位置来注册 (Register) 和解析 (Resolve) 服务.这种做法的目的在于限 ...

  4. My.Ioc 代码示例——注册项的注销和更新

    当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢? 有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”.对于这个问题,有人的回答是“有趣.你为什么 ...

  5. My.Ioc 代码示例——属性和方法注入

    在 My.Ioc 中,我们可以指定让容器在构建好对象实例之后,自动为我们调用对象的公共方法或是为对象的公共属性赋值.在解析对象实例时,容器将根据我们在注册对象时指定的方法调用或属性赋值的先后顺序,调用 ...

  6. My.Ioc 代码示例——Lifetime 和 ILifetimeScope

    很多 Ioc 框架在创建对象的过程中,都会采取某种方式来缓存/复用/释放已构建的对象.在 My.Ioc 中,这个目的是通过 Lifetime/ILifetimeScope 来实现的.其中,Lifeti ...

  7. My.Ioc 代码示例——谈一谈如何实现装饰器模式,兼谈如何扩展 My.Ioc

    装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Io ...

  8. My.Ioc 代码示例——使用条件绑定和元数据(可选)构建插件树

    本文旨在通过创建一棵插件树来演示条件绑定和元数据的用法. 说“插件树”也许不大妥当,因为在一般观念中,谈到插件树,我们很容易会想到 Winform/Wpf 中的菜单.举例来说,如果要在 Winform ...

  9. My.Ioc 代码示例——避免循环依赖

    本文的目的在于通过一些示例,向大家说明 My.Ioc 支持哪些类型的依赖关系.也就是说,如何设计对象不会导致循环依赖. 在 Ioc 世界中,循环依赖是一个顽敌.这不仅因为它会导致 Ioc 容器抛出异常 ...

随机推荐

  1. iOS开发工程师笔试题

    iOS开发工程师笔试题 1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承:可以 ...

  2. 转:PHP如何阻止用户上传成人照片或者裸照

    原文来自于:http://www.hackbase.com/tech/2014-10-12/69367.html 当前,网络淫秽色情信息屡禁不止.屡打不绝,严重危害未成年人身心健康,严重败坏社会风气, ...

  3. Qt学习 之 Socket通信(世界上最简单的例子了)

    最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. ...

  4. 「Poetize5」GF弹钢琴

    描述 Description 现在PianoEater有一架有52个白键和 36个黑键的钢琴,并且他要弹奏的曲子只需要按白键.在同一时刻,他只用弹奏一个音符.如果这个音符不移动大拇指就可以按到,那么他 ...

  5. (转载)PHP静态方法

    (转载)Lamp兄弟连PHP 6.静态方法(static修饰的方法),不能访问非静态成员(在非静态的方法中,可以访问静态成员).因为非静态的成员,就必须用对象来访问,访问内部的成员使用的就是$this ...

  6. Sort Colors —— LeetCode

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  7. 暴力求解——UVA 572(简单的dfs)

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  8. www.chenbowenblog.com 博客地址转移

    我的新博客地址是 www.chenbowenblog.com 欢迎来访.

  9. ASIHttpRequest或者SDWebImage给UIImageView加载图片的逻辑是什么样子的

    非常非常喜欢SDWebImage,就算后来AF也做了图片缓存,我也还是一直使用.图片缓存真的是一件令人头疼的事,但是SDWebImage封装了一切,你所需要的只是简单的set一个URL:1.设置一个展 ...

  10. ab测试

    PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...