Autofac - MVC/WebApi中的应用

Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用.

一、目录结构

先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL, BLL, IDAL, DAL, Helper

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的方式, 来获取想要获取到的类的实例

 

posted @ 2017-01-05 14:24  Sniper_ZL  阅读(757)  评论(1编辑  收藏  举报