使用IOC 依赖注入的问题

首先我在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的

波斯汪
浏览 363回答 3
3回答

缥缈止盈

IOC容器托管了Controller的创建,创建Controller的时候构造INewsService 实例传进去的。

GCT1015

代码号复杂!!!

大话西游666

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);        }    }    
打开App,查看更多内容
随时随地看视频慕课网APP