天天看點

Autofac - MVC/WebApi中的應用

Autofac前面寫了那麼多篇, 其實就是為了今天這一篇, Autofac在MVC和WebApi中的應用.

一、目錄結構

先看一下我的目錄結構吧, 搭了個非常簡單的架構, IOC(web), IBLL, BLL, IDAL, DAL, Helper

Autofac - MVC/WebApi中的應用

public interface ITestBll
{
    void Say(List<string> msg);
}      

 我裡面都是為了實作Say方法的.

public class TestBll : ITestBll
{
    public void Say(List<string> msg)
    {
        msg.Add("進入TestBll中的方法Say");
        var dal =   IocContainer.Create<ITestDal>();
        dal.Say(msg);
    }
}      

ITestDal , TestDal 和上面這兩個内容其實是一樣的, 隻是分層不一樣. 這裡就不貼了.

二、實作

在Application_Start方法的末尾位置, 調用一個注冊方法.

protected void MvcInit()
{
    IocContainer.RegisterMvc();

    IocContainer.RegisterWebApi();

    IocContainer.RegisterTypes(System.Reflection.Assembly.Load("BLL").GetTypes());

    IocContainer.RegisterTypes(System.Reflection.Assembly.Load("DAL").GetTypes());

    IocContainer.Build();
}      

mvc, api 在asp.net中, 都是有自己的一套 ioc 方法的, 這裡其實也可以不寫. 不過這裡就是為了在這裡面的使用來說的.

在helper類庫中, 對autofac具體實作, 加了一些封裝.

public class IocContainer
{
    private static ContainerBuilder builder;

    private static IContainer container;

    static IocContainer()
    {
        builder = new ContainerBuilder();
    }

    #region 注冊接口
    public static void RegisterTypeInstancePerLifetimeScope<T>()
    {
        builder.RegisterType<T>().InstancePerLifetimeScope();
    }
    public static void RegisterTypeInstancePerDependency<T>()
    {
        builder.RegisterType<T>().InstancePerDependency();
    }
    public static void RegisterTypeSingleInstance<T>()
    {
        builder.RegisterType<T>().SingleInstance();
    }

    /// <summary>
    /// 注冊接口
    /// </summary>
    /// <typeparam name="T">實作類型</typeparam>
    /// <typeparam name="IT">接口類型</typeparam>
    public static void RegisterType<T, IT>()
    {
        builder.RegisterType<T>().As<IT>();
    }
    /// <summary>
    /// 自動裝配接口
    /// </summary>
    /// <param name="types"></param>
    public static void RegisterTypes(params Type[] types)
    {
        builder.RegisterTypes(types).AsImplementedInterfaces();
    }

    public static void RegisterType<T, IT>(string name)
    {
        builder.RegisterType<T>().Named<IT>(name);
    }

    public static void RegisterType<T, IT>(int key)
    {
        builder.RegisterType<T>().Keyed<IT>(key);
    }

    #endregion

    #region Build
    public static void Build()
    {
        container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        //DependencyResolver.SetResolver(new AutofacWebApiDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    }
    #endregion

    #region 注冊Mvc
    public static void RegisterMvc()
    {
        builder.RegisterControllers(Assembly.GetCallingAssembly());
    }
    #endregion

    #region 注冊WebApi
    public static void RegisterWebApi()
    {
        builder.RegisterApiControllers(Assembly.GetCallingAssembly());
    }
    #endregion

    #region 建立對象
    public static T Create<T>()
    {
        return container.Resolve<T>();
    }

    public static T Create<T>(string name)
    {
        return container.ResolveNamed<T>(name);
    }

    public static T Create<T>(int key)
    {
        return container.ResolveKeyed<T>(key);
    }

    public static object Create(Type t)
    {
        return container.Resolve(t);
    }
    #endregion
}      

做完上面的這些, 就可以在Controller, BLL, DAL中, 通過ioc的方式, 來擷取想要擷取到的類的執行個體