亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

淺析依賴注入框架Autofac的使用

2020-01-24 01:34:49
字體:
來源:轉載
供稿:網友

下面通過代碼給大家分享下依賴注入框架Autofac的使用,具體如下所示:

 Autofac是一款IOC框架,比較于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級性能上也是很高的。

1)解壓它的壓縮包,主要看到Autofac.dll,Autofac.Configuration.dll,這也是本篇文章重點使用的Autofac的類庫。

2)創建一個控制臺工程,并且引用以上的DLL文件。創建一個數據庫操作接口IDatabase.cs:

/// <summary>/// Database operate interface/// </summary>public interface IDatabase{string Name { get; }void Select(string commandText);void Insert(string commandText);void Update(string commandText);void Delete(string commandText);}

這里包含CRUD四種操作的方法。

3)創建兩種數據庫的操作類,SqlDatabase.cs以及OracleDatabase.cs:

public class SqlDatabase : IDatabase {   public string Name   {     get { return "sqlserver"; }   }  public void Select(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a query sql in {1}!", commandText, Name));   }  public void Insert(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a insert sql in {1}!", commandText, Name));   }  public void Update(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a update sql in {1}!", commandText, Name));   }  public void Delete(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a delete sql in {1}!", commandText, Name));   } } 

以及

public class OracleDatabase : IDatabase {   public string Name   {     get { return "oracle"; }   }  public void Select(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a query sql in {1}!", commandText, Name));   }  public void Insert(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a insert sql in {1}!", commandText, Name));   }  public void Update(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a update sql in {1}!", commandText, Name));   }  public void Delete(string commandText)   {     Console.WriteLine(string.Format("'{0}' is a delete sql in {1}!", commandText, Name));   } }

 
4)接著創建一個數據庫管理器DatabaseManager.cs:

public class DatabaseManager {   IDatabase _database;  public DatabaseManager(IDatabase database)   {     _database = database;   }  public void Search(string commandText)   {     _database.Select(commandText);   }  public void Add(string commandText)   {       _database.Insert(commandText);   }  public void Save(string commandText)   {       _database.Update(commandText);   }  public void Remove(string commandText)   {       _database.Delete(commandText);   }}

5)在控制臺中,編寫以下測試程序:

var builder = new ContainerBuilder();
builder.RegisterType<DatabaseManager>();
builder.RegisterType<SqlDatabase>().As<IDatabase>();
using (var container = builder.Build())
{
    var manager = container.Resolve<DatabaseManager>();
    manager.Search("SELECT * FORM USER");
}

運行結果:

image

分析:

這里通過ContainerBuilder方法RegisterType對DatabaseManager進行注冊,當注冊的類型在相應得到的容器中可以Resolve你的DatabaseManager實例。

復制代碼 代碼如下:

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

通過AS可以讓DatabaseManager類中通過構造函數依賴注入類型相應的接口。

Build()方法生成一個對應的Container實例,這樣,就可以通過Resolve解析到注冊的類型實例。

同樣地,如果你修改數據庫類型注冊為:

復制代碼 代碼如下:

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

運行結果:

image

6)顯然以上的程序中,SqlDatabase或者OracleDatabase已經暴露于客戶程序中了,現在我想將該類型選擇通過文件配置進行讀取。

Autofac自帶了一個Autofac.Configuration.dll 非常方便地對類型進行配置,避免了程序的重新編譯。

修改App.config:


復制代碼 代碼如下:

<configuration>
  <configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <autofac defaultAssembly="AutofacDemo">
    <components>
      <component type="AutofacDemo.SqlDatabase, AutofacDemo" service="AutofacDemo.IDatabase" />
    </components>
  </autofac>
</configuration>

通過Autofac.Configuration.SectionHandler配置節點對組件進行處理。

對應的客戶端程序改為:

復制代碼 代碼如下:

var builder = new ContainerBuilder();
builder.RegisterType<DatabaseManager>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
using (var container = builder.Build())
{
    var manager = container.Resolve<DatabaseManager>();
    manager.Search("SELECT * FORM USER");
}

運行結果:

image

7)另外還有一種方式,通過Register方法進行注冊:

var builder = new ContainerBuilder();//builder.RegisterType<DatabaseManager>();builder.RegisterModule(new ConfigurationSettingsReader("autofac"));builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>()));using (var container = builder.Build()){  var manager = container.Resolve<DatabaseManager>();  manager.Search("SELECT * FORM USER");}

 得到結果也是一樣的。

8)現在我想通過一個用戶類來控制操作權限,比如增刪改的權限,創建一個用戶類:

/// <summary> /// Id Identity Interface /// </summary> public interface Identity {   int Id { get; set; } } public class User : Identity {   public int Id { get; set; }   public string Name { get; set; } }

修改DatabaseManager.cs代碼:

public class DatabaseManager {   IDatabase _database;   User _user;  public DatabaseManager(IDatabase database) : this(database, null)   {   }  public DatabaseManager(IDatabase database, User user)   {     _database = database;     _user = user;   }  /// <summary>   /// Check Authority   /// </summary>   /// <returns></returns>   public bool IsAuthority()   {     bool result = _user != null && _user.Id == 1 && _user.Name == "leepy" ? true : false;     if (!result)       Console.WriteLine("Not authority!");    return result;   }  public void Search(string commandText)   {     _database.Select(commandText);   }  public void Add(string commandText)   {     if (IsAuthority())       _database.Insert(commandText);   }  public void Save(string commandText)   {     if (IsAuthority())       _database.Update(commandText);   }  public void Remove(string commandText)   {     if (IsAuthority())       _database.Delete(commandText);   } }

在構造函數中增加了一個參數User,而Add,Save,Remove增加了權限判斷。

修改客戶端程序:

User user = new User { Id = 1, Name = "leepy" }; var builder = new ContainerBuilder(); builder.RegisterModule(new ConfigurationSettingsReader("autofac")); builder.RegisterInstance(user).As<User>(); builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(), c.Resolve<User>()));using (var container = builder.Build()) {   var manager = container.Resolve<DatabaseManager>();  manager.Add("INSERT INTO USER ..."); }

運行結果:

image

分析:

復制代碼 代碼如下:

builder.RegisterInstance(user).As<User>();注冊User實例。
builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(), c.Resolve<User>()));通過Lampda表達式注冊

DatabaseManager實例。

如果這里我修改User的屬性值:

復制代碼 代碼如下:

User user = new User { Id = 2, Name = "zhangsan" };

運行結果:

image

說明該用戶無權限操作。

以上就是本文的全部內容,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美网站在线观看| 成人伊人精品色xxxx视频| 国产精品黄页免费高清在线观看| 国产精品久久在线观看| 日本一区二区在线播放| 精品久久香蕉国产线看观看亚洲| 成人日韩在线电影| 在线观看日韩欧美| 国产精品久久国产精品99gif| 亚洲伊人久久大香线蕉av| 中文字幕亚洲国产| 国产日本欧美视频| 国外成人在线直播| 国产精品中文久久久久久久| 亚洲第一视频在线观看| 欧美壮男野外gaytube| 亚洲电影免费观看高清完整版在线| 久久九九国产精品怡红院| 国产欧美精品一区二区三区-老狼| 51午夜精品视频| 午夜精品一区二区三区在线播放| 亚洲欧美激情四射在线日| 在线精品视频视频中文字幕| 国内外成人免费激情在线视频网站| 国产va免费精品高清在线观看| 国模私拍一区二区三区| 91精品国产自产在线老师啪| 久久精品视频99| 69国产精品成人在线播放| 国产精品高清网站| 国产日韩精品入口| 精品国产一区二区三区四区在线观看| 亚洲成人精品视频| 97在线视频观看| 色综合老司机第九色激情| 日韩视频一区在线| 欧美国产日韩免费| 欧美性猛交xxxx偷拍洗澡| 日韩中文字幕久久| 国产成人精品亚洲精品| 成人女保姆的销魂服务| 欧美成年人视频网站| 国产一级揄自揄精品视频| 91精品国产自产在线老师啪| 精品国产乱码久久久久久婷婷| 亚洲日韩第一页| 欧美大尺度电影在线观看| 国产一区二区三区视频免费| 91精品一区二区| 国产精选久久久久久| 日韩中文字幕在线播放| 日韩三级影视基地| 久久在线视频在线| 国产精品久久久久99| 国产精品第8页| 日韩中文字幕在线视频| 久久久久北条麻妃免费看| 欧美一区二区色| 亚洲精品国产suv| 成人性生交大片免费观看嘿嘿视频| 成人在线小视频| 亚洲欧美国产精品久久久久久久| 亚洲视频在线观看视频| 亚洲石原莉奈一区二区在线观看| 91在线视频成人| 国产精品高潮在线| 日本一区二区在线播放| 动漫精品一区二区| 亚洲成人网在线观看| 国产精品久久久久免费a∨| 欧美福利视频在线观看| 日韩精品极品视频| 欧美在线视频免费观看| 欧美成人午夜剧场免费观看| 欧美性猛交xxxx免费看| 日韩国产精品视频| 大胆欧美人体视频| 日韩黄色高清视频| 欧美激情视频在线观看| 欧美专区在线视频| 日本91av在线播放| 亚洲91精品在线| 国产不卡精品视男人的天堂| 欧美极品少妇xxxxⅹ免费视频| 国产成人精品免高潮费视频| 国产成人精品一区二区在线| 国产99久久久欧美黑人| 国产噜噜噜噜噜久久久久久久久| 欧美激情aaaa| 欧美大片在线看| 自拍亚洲一区欧美另类| 欧美国产日韩中文字幕在线| 欧美日韩在线视频一区| 91沈先生作品| 91色精品视频在线| www.99久久热国产日韩欧美.com| 日韩电影中文字幕| 久久九九亚洲综合| 久久艳片www.17c.com| 欧洲美女免费图片一区| 北条麻妃一区二区三区中文字幕| 国产精品免费电影| 亚洲国产女人aaa毛片在线| 国产91色在线免费| 欧美高清视频免费观看| 91精品国产自产在线观看永久| 欧美多人爱爱视频网站| 黄色成人av网| 亚洲国产成人精品一区二区| 91产国在线观看动作片喷水| 欧美xxxx做受欧美| 精品国产一区二区三区久久久狼| 国产视频亚洲视频| 欧美裸身视频免费观看| 97视频在线观看免费| 欧美性猛交xxxx偷拍洗澡| 国产不卡一区二区在线播放| 欧美成人性色生活仑片| 岛国av一区二区三区| 欧美色道久久88综合亚洲精品| 久久久亚洲国产| 不卡在线观看电视剧完整版| 国产精品久久精品| 日韩中文字幕在线看| 国产精品久久av| 91在线高清视频| 亚洲美女性视频| 超碰精品一区二区三区乱码| 久热精品视频在线观看一区| 欧美精品www在线观看| 亚洲无线码在线一区观看| 亚洲成人在线网| 亚洲欧美另类自拍| 日韩在线免费视频观看| 国产美女精品视频免费观看| 欧美日韩国产va另类| 成人免费午夜电影| 欧美一级淫片丝袜脚交| 57pao精品| 在线精品国产欧美| 亚洲无av在线中文字幕| 91久久久久久久久| 久久人人爽人人爽人人片亚洲| 国产视频亚洲精品| 一本一本久久a久久精品综合小说| 欧美电影院免费观看| 久久色在线播放| 欧美丰满片xxx777| 亚洲福利在线视频| 久久99久久99精品免观看粉嫩| 国产做受69高潮| 亚洲乱码av中文一区二区| 国产美女搞久久| 色多多国产成人永久免费网站| 伊人久久久久久久久久| 中文字幕日本欧美| 欧美激情精品久久久久久黑人| 亚洲精品一区二区网址| www.日韩系列| 亚洲国产一区二区三区在线观看| 国产精品三级久久久久久电影| 久久精品视频中文字幕| 亚洲aa中文字幕| 亚洲成人av片在线观看|