MEF 根据配置注入Service

有这样的场景 :

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

在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);
        }
    }
}

时间: 2024-08-29 06:51:03

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

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

最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id="loginAction" class="com.dj.ssh.action.LoginAction" scope="prototype" autowire="byName"> <property name="

如何在Java Filter 中注入 Service

在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter{ @Autowired private UsersService usersService; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOExc

Spring容器启动后注入service到Servlet并自动执行

通常做法是定义一个Servlet,并在web.xml中配置Servlet的启动顺序<load-on-startup>的值在DispatcherServlet之后.但这样做的缺点是在Servlet中无法使用Spring的依赖注入功能,只能使用WebApplicationContext的getBean()方法获取bean. 找到的解决办法如下: 1.自定义一个用于代理启动Servlet的类DelegatingServletProxy: package cn.edu.swu.oa.common.ut

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

近些日子在做一个项目,在项目中需要用到spring的定时任务,但是在操作数据库的时候发现总是不能正确的进行数据的插入,经过查看才发现:是因为service层不能够通过普通的方法注入到action,所以这样就不能够执行service层,进而执行数据库的操作. 解决方法:这时需要配置一个service注入的工具类,代码如下: 一.工具类 public class ApplicationContextUtil implements ApplicationContextAware { private s

部署FIM 2010 R2&mdash;5配置Synchronization Service

部署FIM 2010 R2-配置Synchronization Service 配置多有域环境账户密码同步 在各个域创建ADMA账户,并赋予对域的复制目录更改和复制目录更改所有项权限:和对用户的密码重置和解锁密码权限: 在fim01所使用的DNS服务器上,建立同步密码目标域的DNS条件转发:并测试能正常解析目标域: 确保fim01到目标域的域控制器的TCP和UDP端口389.88.464能双向正常通信: 1.打开Synchronization Service窗口, 2.选择Management

sharepoint 2016 配置project service出错:拓扑服务在此服务器场中不可用

测试环境中配置project service出错:拓扑服务在此服务器场中不可用. 原因是由于这个测试环境中,只有一台服务器,配置minrole时,选择的前端,改为单一服务正常:

关于如何在Listener中注入service和ServletContextListener源码分析

今天在做项目时突然发现我该如何向listener中注入service对象,因为监听器无法使用注解注入. 此时有人会想用以下代码通过xml的方式注入: ApplicationContext context=new ClassPathXmlApplication(*.xml); productService =(ProductService)context.getBean("productService"); 这样的话会导致一个问题,那就是Tomcat会两次加载spring的配置文件.所以

配置Reporting Service 2012

配置Reporting Service 2012 MSDN相关内容可参见: http://msdn.microsoft.com/zh-cn/library/bb934490%28v=sql.110%29.aspx 1. Reporting Services Configuration Manager 步骤1:点击"Start","All Programs","Microsoft SQL Server 2012","Configurati

Spring Task中的定时任务无法注入service的解决办法

1.问题 因一个项目(使用的是Spring+SpringMVC+hibernate框架)需要在spring task定时任务中调用数据库操作,在使用 @Autowired注入service时后台报错,导致系统不能访问. 2.代码 定时任务的代码如下: @Componentpublic class TaskJob {        Logger logger = Logger.getLogger(TaskJob.class);        @Autowired    private TempSe