AutoFac在Asp.net MVC中使用
使用工具:VS2015 基于.NET fromwork4.6.1
1.创建ASP.NET Web 应用程序
2.选择一个空结构的MVC项目
3.项目结构:
4.创建控制器 和 视图
5.新建两个类库项目IServices/IBll 一个用来声明接口,一个用来实现
ISerivces:
public interface ISqlHelper { /// <summary> /// 查询 /// </summary> /// <param name="sql"></param> /// <returns>sql</returns> string SeaechSql(string sql); /// <summary> /// 执行 /// </summary> /// <param name="sql"></param> /// <returns>影响行数</returns> int ExecSql(string sql); }
public interface IFtpHelper { bool SendFile(string path); bool DownFile(string path); }
IBll:
public class OracleHepler : ISqlHelper { public int ExecSql(string sql) { //SQL return new Random().Next(2); } public string SeaechSql(string sql) { //SQL return sql; } }
public class FtpHelper : IFtpHelper { /// <summary> /// 文件路径验证 /// </summary> private Regex regex = new Regex(@"^[a-zA-Z]:((\\+[^\/:*?""<>|]+)+)\s*$"); public bool DownFile(string path) { if (regex.IsMatch(path)) { Console.WriteLine($"下载成功:路径{path}"); return true; } Console.WriteLine($"格式错误:路径{path}"); return false; } public bool SendFile(string path) { if (regex.IsMatch(path)) { Console.WriteLine($"传输成功:路径{path}"); return true; } Console.WriteLine($"格式错误:路径{path}"); return false; } }
在MVC项目中配置AutoFac:
Global:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); var build = new ContainerBuilder(); //构建容器 build.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired(); //依赖注入当前应用程序下的所有Controller Assembly asm = Assembly.Load("IBll"); //加载 IBLL下应用程序集 build.RegisterAssemblyTypes(asm).Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired(); //依赖注入IBLL下所有非抽象类的接口实现类 var container = build.Build(); //构建 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //全局注册使用设置 } }
Control:
public class DefaultController : Controller { public IFtpHelper ftp { get; set; } // GET: Default public ActionResult Index() { bool bl= ftp.DownFile("ftp://loaclhost:5000/ftp/1.txt"); return Content(bl.ToString()); } }
运行结果:
在非Controller类中使用AutoFac:【DependencyResolver.Current.GetService<ISqlHelper>();】
1.添加类Tools
public class Tools {
public static int Test()
{
ISqlHelper help = DependencyResolver.Current.GetService<ISqlHelper>();
return help.ExecSql("update table set x=y where a=b");
}
}
在Controller中去调用Tool. Test
public class DefaultController : Controller { public IFtpHelper ftp { get; set; } // GET: Default public ActionResult Index() { /* bool bl = ftp.DownFile("ftp://loaclhost:5000/ftp/1.txt"); */ return Content(Tools.Test().ToString()); } }
执行结果
在子线程中使用AutoFac
PM=> install-package quartz -version 2.6.1
新建 MyJob 定时类
下图为错误用法,无法使用
Golbal中配置计划和定时
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); var build = new ContainerBuilder(); build.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired(); Assembly asm = Assembly.Load("IBll"); build.RegisterAssemblyTypes(asm).Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired(); var container = build.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); { IScheduler scheduler; //调度器工厂 ISchedulerFactory factory; //创建一个调度器 factory = new StdSchedulerFactory(); scheduler = factory.GetScheduler(); scheduler.Start(); //2、创建一个任务 IJobDetail job = JobBuilder.Create<MyJob>().WithIdentity("job1", "group1").Build(); //3、创建一个触发器 //DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/5 * * * * ?") //5秒执行一次 //.StartAt(runTime) .Build(); //4、将任务与触发器添加到调度器中 scheduler.ScheduleJob(job, trigger); //5、开始执行 scheduler.Start(); } } }
调式看结果:
正确使用MyJob中使用:
public class MyJob : IJob { public void Execute(IJobExecutionContext context) { try { ISqlHelper sql; var container = AutofacDependencyResolver.Current.ApplicationContainer; using (container.BeginLifetimeScope()) { sql = container.Resolve<ISqlHelper>(); string s = sql.SeaechSql("SELECT *FROM TABLENAME"); File.WriteAllText($"../App_Data/{DateTime.Now.ToString("yyyyMMddHHmissfff")}.txt", s); } } catch (System.Exception e) { File.WriteAllText($"{HostingEnvironment.MapPath("~/")}/App_Data/{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.txt", e.Message); } } }