Autofac在项目中应用的体会,一个接口多个实现的情况

在本人接触的项目中Autofac应用的比较多一些,我理解的他的工作原理就是  注册类并映射到接口,通过注入后返回相应实例化的类

下面说说我在项目中的实际应用

先来简单介绍下Autofac的使用

1、通过Nuget或代码安装autofac

安装autofac :install-package autofac

安装对mvc4的支持:install -package autofac.mvc4(本人项目为mvc4)

2、新建相应的类及接口,并在autofac中进行映射

2.1、新建接口 INewsHelper

namespace test.Interface
{
    public interface INewsHelper
    {
        string GetNewInfo(int id);
    }
}

2.2、新建类NewsHelper并继承INewsHelper

namespace test.Helper
{
    public class NewsHelper:INewsHelper
    {
        public string GetNewInfo(int id)
        {
            return "newshelper";
        }
    }
}

2.3 新建类SubjectHelper并继承INewsHelper  

namespace test.Helper
{
    public class SubjectHelper:INewsHelper
    {
        public string GetNewInfo(int id)
        {
            return "subjecthelper";
        }

    }
}  

2.4 在autofac中注册并映射

namespace test
{
    // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
    // 请访问 http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<CategoryHelper>().As<ICategoryHelper>().InstancePerHttpRequest();

            builder.RegisterType<NewsHelper>().Named<INewsHelper>("news");
            builder.RegisterType<SubjectHelper>().Named<INewsHelper>("subject");

            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
} 

3、新建ServiceGetter类及  IServiceGetter接口

3.1

namespace test.Interface
{
    public interface IServiceGetter
    {
         T GetByName<T>(string name);
    }
}  

3.2

namespace test.Helper
{
    public class ServiceGetter:IServiceGetter
    {
        public T GetByName<T>(string name)
        {
            return AutofacDependencyResolver.Current.RequestLifetimeScope.ResolveNamed<T>(name);
        }
    }
}

3.3 增加注册

builder.RegisterType<ServiceGetter>().As<IServiceGetter>();

整个步骤3做了一件事,给中间件一个某个泛型的name,由中间件向autofac要相应的class的实例并返回给我,说白了就是干了下面这句代码的事

AutofacDependencyResolver.Current.RequestLifetimeScope.ResolveNamed<INewsHelper>("news");

4、通过构造函数进行注入

namespace test.Controllers
{
    public class HomeController : Controller
    {

        private IServiceGetter getter;

        public HomeController(IServiceGetter getter)
        {

            this.getter = getter;

        }

        public ActionResult Index()
        {

            ViewBag.Message = getter.GetByName<INewsHelper>("subject").GetNewInfo(1);
            return View();
        }

    }
}

Q:为什么没有在HomeController的构造函数中直接就取回呢?

A:应为这个时候我们还不知道具体需要那个实例,所以要在需要的时候通过getter再取回来。

这样就完成了整个对于一个接口多个实现并定义多个Name的情况下,如何通过构造函数注入的方式来实现。

看下实际的效果:

情况1:

效果1:

情况2:

效果2:

时间: 2024-10-22 12:23:24

Autofac在项目中应用的体会,一个接口多个实现的情况的相关文章

[转]MVC4项目中验证用户登录一个特性就搞定

本文转自:http://www.mrhuo.com/Article/Details/470/A-Attribute-For-MVC4-Project-Used-To-Validate-User-Login 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inhe

转:C4项目中验证用户登录一个特性就搞定

转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性.     // 摘要:    //     表示一个特性,该特性用于限制调用方对操作方法的访问.    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]    public class AuthorizeAttrib

java web项目(spring项目)中集成webservice ,实现对外开放接口

什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring兼容性较好的cxf来实现 cxf 的  jar下载地址: http://cxf.apache.org/download.html 选择zip格式下载,解压后的lib目录下的jar 需要最少的jar如下: cxf-2.3.3.jargeronimo-annotation_1.0_spec-1.1.1.

C#.NET常见问题(FAQ)-程序如何把窗体文件从从一个项目中复制到另一个项目

一个窗体有三个文件,全部拷贝到新的项目中 ? 在新的项目中点击显示所有文件,然后右击导入的文件,点击包括在项目中,会自动修改颜色(此时还没有被识别为窗体) ? 重启这个项目,三个文件已经被识别出来了 ? ? 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123 ? 我的在线论坛: http://csrobot.gz01.bdysite.com/ ? 问题交流: QQ:910358960 邮箱:[email protected]

项目中的常量是放在接口里还是放在类里呢?

接口只用于定义类型 ??当类实现接口时,接口就充当可以引用这个类的实例的类型(type).因此,类实现了借口,就表明客户端可以对这个类的实例实施某些动作.为了任何其他目的而定义接口是不恰当的. ??有一种接口被称为常量接口(constant interface),亚布妈祖上面的条件.这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量.使这些常量的类实现这个借口,以避免类名来修饰常量名. // Constant interface antipattern - do not

MVC4项目中验证用户登录一个特性就搞定

在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AuthorizeAttribute : FilterAttribute, IAuthorizationF

AutoFac在项目中的应用

技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCodeBase/tree/master/NetCode/3.常用技能/8.AutoFac/1.AutoFac 先看效果 IBLL IBLL 核心代码: 代码附件: public ActionResult Index() { ITestBLL testBLL = Container.Resolve<ITes

cocos2d-x项目中如何避免增加一个cpp就必须在工程android.mk文件去添加引用

LOCAL_SRC_FILES := hellocpp/main.cpp \       ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp 只要把上面这些替换成下面的: SRC_FILES := hellocpp/main.cpp SRC_FILES += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp) SRC_FILES += $(wildcard $(LOCAL_PA

现有项目中集成Flutter

本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的,这其中的坑,只有写过的人才能体会到. 1. 纯Flutter项目的问题 在论述纯Flutter项目问题之前,我先表述下我的观点(仅限于纯Flutter项目,目前时间2018年6月26日,不排除Flutter的发展,让我的观点改观): 对于个人开发者,可以使用纯Flutter去开发App尝鲜: 对于