本來想聊一下面試過程的,1個星期面了6家,4家當場給offer,2家技術通過(1家沒下文,1家複試).從中也學習到一些東西,先還是繼續Coding吧.

官網:http://autofac.org/

下載:Install-Package Autofac -Version 3.5.2

Autofac是輕量級的開源IOC容器,傳說是速度最快的一個,同類的框架還有用過Castle Windsor、StructureMap、Unity、Spring.Net等.

本節目錄

Hello World

1.建立專案

CA:一個控制檯專案,引用Nuget Autofac包.

2.建立一個依賴外部的類

    public class Test
{
public Test(string str)
{
Console.WriteLine("hello " + str);
}
}

3.根據引數名直接注入

static void Main(string[] args)
{
  //建立容器工廠
var builder = new ContainerBuilder();
//註冊Test型別到工廠中
builder.RegisterType<Test>();
  //通過工廠建立容器
using (var container = builder.Build())
{
    //解析Test並返回Test例項
container.Resolve<Test>(new NamedParameter("str", "world"));
}
Console.ReadKey();
}

過程:首先需要建立容器工廠,然後將各種型別註冊到工廠中,再建立容器,通過容器例項化物件.

注入高階物件

新增1個建構函式

public Test(ISay say)
{
Console.WriteLine("say:" + say.Get());
}

介面及其實現

    public class Say : ISay
{
public string Get()
{
return "hello world";
}
} public interface ISay
{
string Get();
}

注入實現(Autofac會自動裝配)

        static void Main(string[] args)
{
var builder = new ContainerBuilder(); builder.RegisterType<Test>();
builder.RegisterType<Say>().As<ISay>();
using (var container = builder.Build())
{
container.Resolve<Test>();
}
Console.ReadKey();
}

略作修改

     public Test(Say say)//將介面改為指定具體實現類
{
Console.WriteLine("say:" + say.Get());
}

此時執行程式碼會報錯,因為在容器中我們只註冊了ISay介面.改為As<Say>或以下方式

builder.RegisterType<Say>().As<ISay>().AsSelf();

物件生命週期

註冊到工廠的型別預設都呼叫InstancePerDependency方法.實現每個依賴都建立1個新例項

單例模式:

            builder.RegisterType<Test>().SingleInstance();

讀取配置檔案注入

需要引用Nuget Autofac.Configuration包

註冊型別程式碼

builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

App.config

  <configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
</configSections>
<autofac defaultAssembly="CA">
<components>
<component type="CA.Say, CA" service="CA.ISay" />
<component type="CA.Say, CA" service="CA.Say" />
</components>
</autofac>

service相當於As<T>中的T

結合ASP.NET MVC

1.Install-Package Autofac.Mvc5

2.Application_Start事件新增此方法

        protected void Application_Start(object sender, EventArgs e)
{
#region 1.MVC Autofac注入
var builder = new ContainerBuilder();
//類名.EndsWith("Controller")
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//這樣既支援介面 又支援自己的型別
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces().AsSelf();
//容器
var container = builder.Build();
//注入改為Autofac注入
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
#endregion #region 2.註冊MVC路由
var routes = RouteTable.Routes;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
#endregion
}

3.帶引數的控制器建構函式

    public class HomeController : Controller
{
public HomeController(Say say)
{ }
public string Index()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
}

4.瀏覽器訪問~/

結合ASP.NET Web API

1.Install-Package Autofac.WebApi

2.由於WebAPI需要,引用系統自帶Web.Http和Web.Http.WebHost

3.Application_Start新增此方法

        protected void Application_Start(object sender, EventArgs e)
{
var configuration = GlobalConfiguration.Configuration;
#region Autofac WebAPI注入
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
var container = builder.Build();
configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
#endregion #region 註冊Web API路由
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
#endregion
}

4.帶引數的控制器建構函式

    public class ValuesController : ApiController
{
public ValuesController(Say say)
{ }
public string Get()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
}

5.瀏覽器訪問~/api/values

結合WCF

1.Install-Package Autofac.Wcf

2.Application_Start新增此方法

        protected void Application_Start(object sender, EventArgs e)
{
#region WCF Autofac注入
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
var container = builder.Build();
//WCF IOC容器
AutofacHostFactory.Container = container;
#endregion
}

3.新建svc服務

    public class TestService : ITestService
{
public TestService(Say say)
{ }
public string DoWork()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
} [ServiceContract]
public interface ITestService
{
[OperationContract]
string DoWork();
}

4.svc指令中加一句:

Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"

5.wcftestclient

慚愧,好久沒發部落格了