为了账号安全,请及时绑定邮箱和手机立即绑定

使用IOC 依赖注入的问题

使用IOC 依赖注入的问题

波斯汪 2018-12-07 08:18:30
首先我在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的
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-01-21
?
GCT1015

TA贡献1827条经验 获得超4个赞

代码号复杂!!!

查看完整回答
反对 回复 2019-01-21
?
大话西游666

TA贡献1817条经验 获得超14个赞

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

 

 

查看完整回答
反对 回复 2019-01-21
  • 3 回答
  • 0 关注
  • 362 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信