终于把丢了好久的MVC捡起来,虽然有些许印象,但是还需要重新学习。
很多书本中都提到依赖注入,控制反转等概念,这些都是为了实现松耦合层、组件和类目的。
常见的是使用Repository类分离Controller和Model的直接联系。而为了解除Repository类和Controller的紧密联系,通常不是直接定义Repository类并实例化,而是通过Controller的构造方法注入指定的Repository.
1 public class ValuesController : ApiController 2 { 3 4 private IOneServices _oneServices; 5 6 public ValuesController(IOneServices oneServices) 7 8 { 9 _oneServices = oneServices; 10 11 }12 //..........13 }
流行的IoC容器有:Ninject,Autofac,Unity.
现就Autofac注入MVC5和Webapi2的使用方法做出简要讲解。
1、使用nupkg引用Autofac,Autofac.Mvc5和Autofac.Webapi2
PM> install-package autofac -version 3.5.0
PM> install-package autofac.mvc5
PM> install-package autofac.webapi2 (注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiDependencyResolver.BeginScope()”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。”错误。)
2.注册组件.
var builder=new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());//注册api容器的实现
builder.RegisterControllers(Assembly.GetExecutingAssembly());//注册mvc容器的实现
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以services结尾的类型
.Where(t => t.Name.EndsWith("Services"))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以Repository结尾的类型
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
3.创建一个Container以备后用.
var container=builder.Build();
4.从Container创建一个 lifetime scope .
5.使用这个Lifetime Scope 来解析组件的实例.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);//注册api容器需要使用HttpConfiguration对象 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//注册MVC容器
6.在WebApiConfig类的Register方法中,调用上述步骤代码,并传入HttpConfiguration对象。
autofac的优点是可一次性解除耦合,而不需要配置;autofac更好的实现了MVC中“约定大于配置”的概念。