[Solution] 使用Autofac在MVC、Web API、WCF中實現IOC


本來想聊一下面試過程的,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

 

慚愧,好久沒發博客了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM