有这样的场景 :

现在一个接口有很多种实现类,需要根据配置,来确定确定调用哪个具体的实现类。这样使得软件扩展性大大提高

在MEF可以通过ExportMetadata 来实现这样的效果。

1.现在我们建个接口:

namespace ConsoleApplication1.Interface
{
public interface IMIService
{
void SignIn();
}
}

2.新建一个meta类

namespace ConsoleApplication1.Metadata
{
public interface PlaceMetadata
{
string Place { get; }
}
}

3.有两个实现类

namespace ConsoleApplication1.Impl
{
//[Export("hangzhou", typeof(IMIService))]
[Export(typeof(IMIService))]
[ExportMetadata("Place", "hangzhou")]
public class HZMIService : IMIService
{
public void SignIn()
{
Console.WriteLine("HZ SignIn");
}
}
}
namespace ConsoleApplication1.Impl
{
//[Export("shanghai", typeof(IMIService))]
[Export(typeof(IMIService))]
[ExportMetadata("Place", "shanghai")]
public class SHMIService : IMIService
{
public void SignIn()
{
Console.WriteLine("SH MI");
}
}
}

4.在程序中根据不同的配置来调用不同的实现类

namespace ConsoleApplication1
{
class Program
{
//const string place = "hangzhou"; //[Import(place)]
//public IMIService MIService { set; get; } [ImportMany]
IEnumerable<Lazy<IMIService, PlaceMetadata>> DoList { set; get; } public IMIService MIService { set; get; } static void Main(string[] args)
{
Program program = new Program();
program.Compose(); var service = program.DoList.Where(x => x.Metadata.Place == "hangzhou").FirstOrDefault();
program.MIService = service.Value;
program.MIService.SignIn();
} void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
}

MEF 根据配置注入Service的更多相关文章

  1. Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程

    最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id=& ...

  2. 如何在Java Filter 中注入 Service

    在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...

  3. spring整合Jersey 无法注入service的问题

    现象: action中的@autowired注入service或dao失败,报空指针异常 原因: 造成该问题的原因是你并没有做好spring和jersey的整合工作,检查你的web.xml文件,jer ...

  4. java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)

    近些日子在做一个项目,在项目中需要用到spring的定时任务,但是在操作数据库的时候发现总是不能正确的进行数据的插入,经过查看才发现:是因为service层不能够通过普通的方法注入到action,所以 ...

  5. springboot拦截器注入service为空

    一般都是因为除了在拦截器之外,还需要在拦截器的配置类中,注册拦截器时没有使用spring的bean,而是使用了new创建bean造成的. @Configuration public class Web ...

  6. 如何在Java的Filter中注入Service???

    今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在s ...

  7. Spring-Boot:多种配置注入方式

    package com.example.el; import org.springframework.beans.factory.annotation.Value; import org.spring ...

  8. spring boot测试类自动注入service或dao

    使用Spring Boot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针异常. Spring Boo ...

  9. Spring Boot Service注入为null mapper注入为null @Component注解下@Value获取不到值 WebsocketServer类里无法注入service

    最近搞了一下websocket前台(这个网上有很多的教程这里就不班门弄斧啦) 以及前后台的交互 和后台的bug(搞了两天) 也是状态频发 bug不断 下面说一说问题. Websocket主类里面无法注 ...

随机推荐

  1. 【小白的CFD之旅】17 需要编程?

    小白经过大半个多月对于CFD的学习,终于对其大概轮廓有了初步的了解,尤其是在与小牛师兄交流之后.小牛师兄毕竟是专业学流体力学的,小白认为在流体力学理论方面自己与牛师兄至少存在5年的差距.不过小白并不气 ...

  2. spark dataframe unionall

    今天本来想写一个spark dataframe unionall的demo,由于粗心报下面错误: Exception in thread "main" org.apache.spa ...

  3. 浅谈Oracle权限体系

    对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系. 1.账户管理 在此之前,先解释下一个容易混淆的概念:模式.所谓模式,指的是用户账户所拥有的一组对象(比如表,索引, ...

  4. 【2016-10-17】【坚持学习】【Day9】【反射】

    3个主要命名空间 System.Type System.Reflection System.Reflection.Assembly 2个主要类 System.Type System.Reflectio ...

  5. Spark的精简安装步骤---陈楠心血总结

    1.下载解压 (1)安装Scala-2.10.4并解压 (2)/etc/profile加入PATH路径 (3)source /etc/profile使PATH的配置生效 (4)下载并解压spark-1 ...

  6. HDU 1729 Stone Game【SG函数】

    以下转载至:长春理工大学赵小舟博弈论ppt 题目大意: 1.有n个盒子,每个盒子都有它的容量s 2.在游戏开始时,每个盒子里都有一些石子 3.双方轮流进行游戏,向一个盒子投入n个石子,其中n不能大于当 ...

  7. RAID级别

    raid磁盘阵列,我们一般使用RAID 5,挂载单独硬盘测试读写速度,一般使用RAID0.

  8. 美化radio和checkbox样式

    HTML部分 <div id="holder"> <div> <div class="tag">Checkbox Small ...

  9. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(二)

    Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现. shiro对缓存的支持 shiro并没有实现缓存 ...

  10. ob_start()

    ob_start()函数用于打开缓冲区 1.用于header()之前 ob_start(); //打开缓冲区 echo "Hellon"; //输出 header("lo ...