本文只适合初步接触 autoafc 的小白,大佬勿喷。
autofac是一种很轻量的一个依赖注入容器
暂时先说一下手动注入的方式(因为使用自动注入遇到了坑,暂时先写一下手动注入)
1.先定义接口
public interface IAccountService:IDependency
{
/// <summary>
/// 获取账户信息
/// </summary>
/// <param name="accountName">账户名</param>
/// <returns>账户信息</returns>
AccountBases GetAccount(string accountName);
}
此处的 IDependency 仅仅为一个空接口
2.接口的实现
public class AccountService : BaseService, IAccountService
{
public AccountBases GetAccount(string accountName)
{
///实现代码,CRUD等等
}
}
3.控制器的使用
private IAccountService AcountService;
///构造函数
public LoginController(IAccountService accountService)
{
AcountService = accountService;
}
public ActionResult Login(AccountBases loginInfo)
{
......... AccountBases entity = AcountService.GetAccount(loginInfo.AccountName);
.........
}
代码中的 AcountService.GetAccount(loginInfo.AccountName) 就实现了依赖注入,传统的写法 为
AcountService as = new AcountService();
AccountBases entity = as.GetAccount(loginInfo.AccountName); 两者相比较依赖注入会更方便一点,除了方便,依赖注入的作用主要是为了降低系统的耦合。
4.核心:autofac,要使用autofac就得先去引入他的nuget包,这里就不说明了,不会的可以百度。
首先:新建一个类来初始化和注入实现
public class AutofacConfig
{
/// <summary>
/// 初始化
/// </summary>
public static void Initialise()
{
var builder = RegisterService();
DependencyResolver.SetResolver(new AutofacDependencyResolver(builder.Build()));
} /// <summary>
/// 注入实现
/// </summary>
/// <returns></returns>
private static ContainerBuilder RegisterService()
{
var builder = new ContainerBuilder();
builder.RegisterType<AccountService>().As<IAccountService>();
builder.RegisterType<BusinessPaymentsService>().As<IBusinessPaymentsService>();
builder.RegisterType<ClearAllService>().As<IClearAllService>();
builder.RegisterType<MemberService>().As<IMemberService>();
builder.RegisterType<InInventoryDetailsService>().As<IInInventoryDetailsService>(); ////扫描IService和Service相关的程序集
var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToList(); //控制器注入
builder.RegisterControllers(assemblys.ToArray()); return builder;
}
}
使用 builder.RegisterType 来手动注入你想注入的接口 最后在Global文件中配置就完成了
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); //autofac依赖注入
AutofacConfig.Initialise(); Database.SetInitializer<ClearContext>(null);
}
autofac的手动注入到这就完成了。