zoukankan      html  css  js  c++  java
  • Asp.Net Web Forms/MVC/Console App中使用Autofac

    本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc、控制台应用程序中使用Autofac,详情请看源码

    ASP.NET Web Forms使用Autofac,至少需要一下步骤:

    1,引用Autofac程序集。

    2,添加Autofac Web Modules 到 Web.config。

    3,在Global.asax中实现IContainerProviderAccessor接口。

    我们创建一个ASP.NET Web Forms项目,命名为WebFormStudy。

    添加引用

    添加引用的最简单方式就是用NuGet,右击WebFormStudy项目下的References,选择Manage NuGet Packages,如下图:

     

    在Search Online中输入auto.web字样,Autofac WebForms Intergration 就搜索到了,点击Install。

    安装完后,我们就可以在References中看到添加了Autofac.dll和Autofac.Integration.Web.dll,如下图:

     

    添加ModulesWeb.config

    Autofac管理组件的生命周期并且添加依赖注入到Asp.net管道是通过IHttpModule实现的(注:在HttpApplication 初始化过程中,会根据配置文件加载并初始化相应的实现了IHttpModule接口的HttpModule 对象。对于HttpApplication来说,在它处理HTTP 请求的不同阶段会触发不同的事件,而HttpModule 的意义在于通过注册HttpApplication 的相应的事件,将所需的操作注入整个HTTP 请求的处理流程。ASP.NET 的很多功能,比如身份验证、授权、缓存等,都是通过相应的HttpModule 实现的。摘自:Asp.net Mvc4框架揭秘),你需要在web.config中配置这些Modules。

    幸运的是,如果通过NuGet添加Autofac程序集,在安装的时候自动在Web.config中配置了相应的Modules,如下图:

     

    Global.aszx中实现IContainerProviderAccessor接口

    依赖注入模块需要HttpApplication实例实现IContainerProviderAccessor接口。一个完整的全局Application类如下所示:

      public class Global : HttpApplication,IContainerProviderAccessor

        {

            static IContainerProvider _containerProvider;

            public IContainerProvider ContainerProvider

            {

                get { return _containerProvider; }

            }

            void Application_Start(object sender, EventArgs e)

            {

                // Code that runs on application startup

                RouteConfig.RegisterRoutes(RouteTable.Routes);

                BundleConfig.RegisterBundles(BundleTable.Bundles);

                #region 我们添加的代码

                var builder = new ContainerBuilder();

                //注册将被通过反射创建的组件

                builder.RegisterType<DatabaseManager>();

                builder.RegisterType<OracleDatabase>().As<IDatabase>();

                _containerProvider = new ContainerProvider(builder.Build());

                #endregion

            }

        }

    DatabaseManager、OracleDatabase等类代码:

     public interface IDatabase
        {
            string Name { get; }
    
            string Select(string commandText);
    
            string Insert(string commandText);
    
            string Update(string commandText);
    
            string Delete(string commandText);
        }
    IDatabase
     public class DatabaseManager
        {
            IDatabase _database;
    
            public DatabaseManager(IDatabase database)
            {
                _database = database;
            }
    
            public string Search(string commandText)
            {
                return _database.Select(commandText);
            }
    
            public string Add(string commandText)
            {
                return _database.Insert(commandText);
            }
    
            public string Save(string commandText)
            {
                return _database.Update(commandText);
            }
    
            public string Remove(string commandText)
            {
                return _database.Delete(commandText);
            }
    
        }
    DatabaseManager
     public class SqlDatabase : IDatabase
        {
            public string Name
            {
                get { return "sqlserver"; }
            }
    
            public string Select(string commandText)
            {
                return string.Format("'{0}' is a query sql in {1}!", commandText, Name);
            }
    
            public string Insert(string commandText)
            {
               return  string.Format("'{0}' is a insert sql in {1}!", commandText, Name);
            }
    
            public string Update(string commandText)
            {
                return  string.Format("'{0}' is a update sql in {1}!", commandText, Name);
            }
    
            public string Delete(string commandText)
            {
                return  string.Format("'{0}' is a delete sql in {1}!", commandText, Name);
            }
        } 
    SqlDatabase
        public class OracleDatabase : IDatabase
        {
            public string Name
            {
                get { return "oracle"; }
            }
    
            public string Select(string commandText)
            {
                return string.Format("'{0}' is a query sql in {1}!", commandText, Name);
            }
    
            public string Insert(string commandText)
            {
                return  string.Format("'{0}' is a insert sql in {1}!", commandText, Name);
            }
    
            public string Update(string commandText)
            {
               return  string.Format("'{0}' is a update sql in {1}!", commandText, Name);
            }
    
            public string Delete(string commandText)
            {
                return  string.Format("'{0}' is a delete sql in {1}!", commandText, Name);
            }
        }
    OracleDatabase

    运行下,糟糕,报错了,如下图:

    没关系,注释如下配置信息:

     

    再次运行,ok,如下图:

     源码地址

    参考引用: http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html

  • 相关阅读:
    能者摹形 大师窃意
    Nginx负载均衡的详细配置及使用案例详解.
    Zookeeper 4、Zookeeper开发
    nginx负载均衡
    Git:husky > npm run s precommit
    关于数据库路径 DataDirectory
    关于在VS2010 ASP.NET MVC3中使用WebService的实例
    SQLite的SQL语法
    获取IE可见高度和内容高度 记录
    转文:ASP.NET运行机制原理
  • 原文地址:https://www.cnblogs.com/zhangzhi19861216/p/3757141.html
Copyright © 2011-2022 走看看