首先我在global.ascx中,在应用程序启动之前添加了如下代码,调用了Application_start 进行了依赖注入
namespace MVC3.Extensions
{
public class Application_Start
{
public static void Run()
{
var builder = new ContainerBuilder();
var data = Assembly.Load("Service");
builder.RegisterAssemblyTypes(data)
.Where(a=>a.FullName.Contains("SqlServer")).AsImplementedInterfaces();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}
在我的项目中有IService,Service,Models这三个类库,但是我今天阅读别人的代码,发现在网站启动的HomeController的构造函数中存在
public class HomeController : Controller
{
private readonly INewsService _newsService;
//
// GET: /Home/
private const string picturePath = "~/xml/pictureRoll.xml";
public ActionResult Index()
{
List<News> list = _newsService.GetAll();
return View(list);
}
public HomeController(INewsService newsService)
{
this._newsService = newsService;
}
public ActionResult PictureRoll()
{
System.Text.StringBuilder picture = new System.Text.StringBuilder();
XElement xe = XElement.Load(Server.MapPath(picturePath));
var query = from value in xe.Elements("img")
select value;
foreach (var item in query)
{
picture.Append(string.Format("<img src=\"/File/ScrollImage/{0}\" title=\"{1}\" alt=\"{1}\"/>",item.Element("path").Value,item.Element("title").Value));
}
ViewBag.PictureScroll = picture.ToString();
return View();
}
}
我现在就想知道,这个构造函数中的参数是如何传递到homeController的
IOC容器托管了Controller的创建,创建Controller的时候构造INewsService 实例传进去的。
IOC容器创建了Controller,但是我没有指定这个HomeController的构造函数参数,为什么就是传入的这个参数呢?我百思不得解,
@baidixing:
不是注册了Service这个程序集吗?它构造newsService参数时就去Service程序集里查找实现了INewsService 接口的类创建它的实例作为参数传进去了。
@向往-SONG: 说的有道理 ,我感觉有点明白了 我再去看一下IOC基础的 应该能够理解
代码号复杂!!!
1. IoC容器的一些基本认识要知道:初始化应该在 Application_Start启动时初始化了,注册映射由编程和配置文件,大多数选择配置文件,里面有 HomeController以及 HomeController构造函数INewsService 等类型映射。
2.IoC使用:既能以及初始化了,类型都已经注册了,我们就要使用IoC容器,它就是用来创建对象的,如创建HomeController,应该会有 IoC.Resolve<IController>(......)等解析对象的代码,如果你不知道 它解析时为什么参数会有值,再看看IoC方面的一些基本知识。
3.什么地方会使用IoC容器:就是控制反转,什么控制反转,就是创建对象的这个控制权转交给IoC容器了,如,你的HomeController 什么时候会创建,默认的话,应该是mvc的DefaultControllerFactory创建,是没有参数的构造函数,你的代码里是有参数的构造函数,又要用到IoC来创建,应该有 重写 创建控制器对象的代码,IoC应该会在这个重写的地方出现。
如: public class ControllerFactoryTest : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return IoC.Resolve<IController>(controllerType);
}
}