天天看點

Autofac在MVC中實作自動注冊

1、在控制台執行指令安裝Autofac元件

Install-Package Autofac

Install-Package Autofac.Mvc5 -Version 4.0.2

using Autofac.Integration.Mvc; //注冊控制器時會用到

2、定義IAutoInject、ISendMessage接口及其實作類

public interface IAutoInject { }
 public interface ISendMessage : IAutoInject { string SendMessage(); }
 public class Phone : ISendMessage { }
 public class Email : ISendMessage { }
           

3、添加Autofac配置項并初始化

a、在App_Start檔案夾中添加AutofacConfig.cs,并在其中添加初始化方法

b、在Global.asax檔案下的Application_Start()内調用AutofacConfig.Initialize();進行注冊

public static void Initialize()
{
    var builder = new ContainerBuilder();
    //擷取IAutoInject的Type
    var iautoInject = typeof(IAutoInject);
    //擷取ISendMessage的Type
    var isendMessage = typeof(ISendMessage);
    //擷取所有程式集
    var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
    //擷取某程式集
    //Assembly[] assemblies = new Assembly[] 
    //{                 
    //    Assembly.Load("AutofacDemo.Web"),
    //    Assembly.Load("AutofacDemo.Models")
    //};
    //自動注冊接口
    builder.RegisterAssemblyTypes(assemblies)
           .Where(b => b.GetInterfaces().Any(c => c == iautoInject && b != iautoInject))
           .AsImplementedInterfaces().InstancePerLifetimeScope();
    builder.RegisterAssemblyTypes(assemblies)
           .Where(b => b.GetInterfaces().Any(c => c == isendMessage && b != isendMessage))
           .AsImplementedInterfaces().InstancePerLifetimeScope();
    //自動注冊控制器
    builder.RegisterControllers(assemblies);
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
           

4、編寫測試代碼

public interface IAutoInject{  }
public interface ISendMessage : IAutoInject
{
    string SendMessage();
}
public class Phone : ISendMessage
{
    public string SendMessage()
    {
        return "Phone";
    }
}
public class Email : ISendMessage
{
    public string SendMessage()
    {
        return "Email";
    }
}
public class HomeController : Controller
{
    private ISendMessage sendMessage;

    public HomeController()
    {
    }    

    public HomeController(ISendMessage sendMessage)
    {
        this.sendMessage = sendMessage;
    }

    public ActionResult Index()
    {
        string result = sendMessage.SendMessage();
        return View();
    }
}
           

sendMessage.SendMessage()可以正确傳回結果說明依賴注入成功。