Autofac在项目中应用的体会,一个接口多个实现的情况
2014-11-22 18:17
369 查看
在本人接触的项目中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:
相关文章推荐
- Autofac在项目中应用的体会,一个接口多个实现的情况
- Autofac在项目中应用的体会,一个接口多个实现的情况
- autofac 一个接口多个实现的顺序执行
- @resource、@Autowired、@Service在一个接口多个实现类中的应用
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
- AndroidStudio一个工程内查看多个项目的实现
- spring 注入@Autowired @Qualifier 一个接口多个实现类
- spring注解 实现一个接口多个实现类的区分
- Java 学习笔记--解决一个类实现多个接口的问题
- java允许一个类实现多个接口,
- 一个简单的matlab项目实现三层神经网络的简单应用
- 用接口实现,在非跳转情况下,一个界面向Activity传数据
- 使用@Named注解(一个接口多个实现,匹配引入想要的实现类)
- 加载多个实现类实现了同一个接口方法
- C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理
- 在一个项目中跨领域调用接口的的实现
- PHP----------用curl方式请求接口在同一个项目里面的时候不能请求的情况
- 合并多个python list以及合并多个 django QuerySet 的方法在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况。单纯从技
- 结合Java实现的一个腾讯空间备份器谈谈MVC思想在Swing桌面项目中的应用