建立一個MVC項目,如 AutoFacTest,引用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,看是否能放回張三的年齡。
我們可以發現,傳回了張三的年齡。說明我們注入成功了。
總結:
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類型,否則将映射失敗。