天天看點

ASP.NET MVC IOC 之 Autofac(一)

建立一個MVC項目,如 AutoFacTest,引用autofac,如下圖:

ASP.NET MVC IOC 之 Autofac(一)

接下來就是開始進行程式設計了

首先,建立一個類庫,名為 AutoFacTest.Service,該類庫編寫服務層代碼,我們的接口和實作就都放在服務層

建立一個IStudentService.cs 接口,具體代碼如下:

namespace AutoFacTest.Service
{
   public interface IStudentService
   {
       int GetStudentAge(string name);
   }
}      

接着,建立一個實作類 StudentService.cs ,繼承IStudentService,如下:

namespace AutoFacTest.Service.impl
{
   public class StudentService:IStudentService
    {
       public int GetStudentAge(string name)
       {
           int age = 0;
           switch (name)
           {
                case "張三":
                   age = 10;break;
                case "李四":
                   age = 12;break;

           }
           return age;
       }
    }
}      

定義了一個方法,根據姓名擷取年齡。

服務層準備好了,接下來就是開始做注入工作了。

打開Global.cs 檔案

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            AutoFacRegister(); //注入
        }

        private void AutoFacRegister()
        {
            var builder = new ContainerBuilder();
            //注冊MVC控制器(注冊所有到控制器,控制器注入,就是需要在控制器的構造函數中接收對象)
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            /*接口實作,構造函數注入,對StudentService與接口進行注入*/
            builder.RegisterType<StudentService>().As<IStudentService>();

            //設定依賴解析器
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }      

 至此,完成第一步的注入。此方式為構造函數注入的方式。

接下來就是見證結果的時刻了,我們來看看控制器裡面怎麼弄。

建立一個控制器 Home,上控制器代碼。

public class HomeController : Controller
    {
        public IStudentService Stu; //定義全局的學醬油象類對象
        /// <summary>
        /// 通過構造函數進行注入,注意,參數是抽象類,非實作類。因為已經在global中将實作類映射給了抽象類
        /// </summary>
        /// <param name="stu"></param>
        public HomeController(IStudentService stu)
        {
            this.Stu = stu;
        }
        // GET: Home
        public void Index()
        {
            Response.Write("學生類:"+ Stu.GetStudentAge("張三")+"<br />");
        }
    }      

至此,完成處理,接下來,我們就通路 index,看是否能放回張三的年齡。

ASP.NET MVC IOC 之 Autofac(一)

我們可以發現,傳回了張三的年齡。說明我們注入成功了。

總結:

1、采用的是構造函數注入的方式,在構造函數中初始化指派。

2、Stu對象不需要執行個體化,即不需要new。降低了系統資源的消耗。

3、需要在global中對StudentService寫映射,如果服務類比較多的時候,就需要寫很多,如何避免,這個在後面章節講解。

擴充: 上面講解了 構造函數注入的方式,下面擴充屬性注入的方式。

在global.cs中稍微修改下注入語句即可。

将:

builder.RegisterControllers(typeof(MvcApplication).Assembly);      

改為:

builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired();      
PropertiesAutowired:即,表示允許屬性注入。

接下來我們來看怎麼使用。      
public class HomeController : Controller
    {
        public IStudentService Stu { get; set; } //定義全局的學醬油象類對象
        /// <summary>
        /// 通過構造函數進行注入,注意,參數是抽象類,非實作類。因為已經在global中将實作類映射給了抽象類
        /// </summary>
        // GET: Home
        public void Index()
        {
            Response.Write("學生類:"+ Stu.GetStudentAge("張三")+"<br />");
        }
    }      

控制器裡面寫的代碼就簡單很多了。

注意:Stu必須定義為public類型,否則将映射失敗。

繼續閱讀