首页 新闻 会员 周边

使用IOC 依赖注入的问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-10-31 09:26

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

baidixing的主页 baidixing | 初学一级 | 园豆:107
提问于:2012-10-30 17:55
< >
分享
最佳答案
0

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

向往-SONG | 老鸟四级 |园豆:4853 | 2012-10-30 20:17

IOC容器创建了Controller,但是我没有指定这个HomeController的构造函数参数,为什么就是传入的这个参数呢?我百思不得解,

baidixing | 园豆:107 (初学一级) | 2012-10-30 22:38

@baidixing: 

不是注册了Service这个程序集吗?它构造newsService参数时就去Service程序集里查找实现了INewsService 接口的类创建它的实例作为参数传进去了。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-30 22:48

@向往-SONG: 说的有道理 ,我感觉有点明白了 我再去看一下IOC基础的 应该能够理解

baidixing | 园豆:107 (初学一级) | 2012-10-31 09:25
其他回答(2)
0

代码号复杂!!!

西安-DB | 园豆:4 (初学一级) | 2012-10-30 18:11
1

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);
        }
    }

 

 

收获园豆:10
Qlin | 园豆:2403 (老鸟四级) | 2012-10-31 08:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册