最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年07月31日 10:11:10   作者:瘋狂的瓶子  
Autofac是一款I(lǐng)OC框架,比起Spring.NET,Unity,Castle等等框架,它很輕量級且性能也很高,下面小編給大家介紹下依賴注入框架Autofac的使用。

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

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

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

2)創(chuàng)建一個控制臺工程,并且引用以上的DLL文件。創(chuàng)建一個數(shù)據(jù)庫操作接口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)創(chuàng)建兩種數(shù)據(jù)庫的操作類,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)接著創(chuàng)建一個數(shù)據(jù)庫管理器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");
}

運行結(jié)果:

image

分析:

這里通過ContainerBuilder方法RegisterType對DatabaseManager進(jìn)行注冊,當(dāng)注冊的類型在相應(yīng)得到的容器中可以Resolve你的DatabaseManager實例。

復(fù)制代碼 代碼如下:

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

通過AS可以讓DatabaseManager類中通過構(gòu)造函數(shù)依賴注入類型相應(yīng)的接口。

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

同樣地,如果你修改數(shù)據(jù)庫類型注冊為:

復(fù)制代碼 代碼如下:

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

運行結(jié)果:

image

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

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

修改App.config:


復(fù)制代碼 代碼如下:

<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配置節(jié)點對組件進(jìn)行處理。

對應(yīng)的客戶端程序改為:

復(fù)制代碼 代碼如下:

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");
}

運行結(jié)果:

image

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

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");
}

 得到結(jié)果也是一樣的。

8)現(xiàn)在我想通過一個用戶類來控制操作權(quán)限,比如增刪改的權(quán)限,創(chuàng)建一個用戶類:

/// <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); 
  } 
}

在構(gòu)造函數(shù)中增加了一個參數(shù)User,而Add,Save,Remove增加了權(quán)限判斷。

修改客戶端程序:

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 ..."); 
}

運行結(jié)果:

image

分析:

復(fù)制代碼 代碼如下:

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

DatabaseManager實例。

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

復(fù)制代碼 代碼如下:

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

運行結(jié)果:

image

說明該用戶無權(quán)限操作。

以上就是本文的全部內(nèi)容,希望大家喜歡。

相關(guān)文章

  • C#實現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中

    C#實現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中

    這篇文章主要介紹了C#實現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中,本文直接給出示例代碼,需要的朋友可以參考下
    2015-06-06
  • C# 實現(xiàn)把double 存成兩位精度小數(shù)

    C# 實現(xiàn)把double 存成兩位精度小數(shù)

    這篇文章主要介紹了C# 實現(xiàn)把double 存成兩位精度小數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#實現(xiàn)FTP傳送文件的示例

    C#實現(xiàn)FTP傳送文件的示例

    這篇文章主要介紹了C#實現(xiàn)FTP傳送文件的示例,幫助大家更好的理解和學(xué)習(xí)c#的使用,感興趣的朋友可以了解下
    2020-12-12
  • C#將HashTable中鍵列表或值列表復(fù)制到一維數(shù)組的方法

    C#將HashTable中鍵列表或值列表復(fù)制到一維數(shù)組的方法

    這篇文章主要介紹了C#將HashTable中鍵列表或值列表復(fù)制到一維數(shù)組中方法,涉及C#操作HashTable的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 基于Unity制作一個簡易的計算器

    基于Unity制作一個簡易的計算器

    今天主要和大家分享如何使用Unity制作計算器,難度中等,可以用來學(xué)習(xí),或者當(dāng)成其他項目的小組件導(dǎo)入。當(dāng)然,也可以導(dǎo)出來,發(fā)布到網(wǎng)頁端,來做一個嵌入式工具也可以。感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-03-03
  • C#8.0中的模式匹配

    C#8.0中的模式匹配

    這篇文章介紹了C#8.0中的模式匹配,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C# 讀寫XML文件實例代碼

    C# 讀寫XML文件實例代碼

    在本篇文章里小編給大家整理的是關(guān)于C# 讀寫XML文件最簡單方法,需要的朋友們可以跟著學(xué)習(xí)參考下。
    2020-03-03
  • 解析C#中如何把控件的邊框角畫為圓弧

    解析C#中如何把控件的邊框角畫為圓弧

    以下是對C#中把控件的邊框角畫為圓弧的實現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以參考下
    2013-07-07
  • c# 實時曲線圖示例代碼

    c# 實時曲線圖示例代碼

    這篇文章主要介紹了如何用c# 實現(xiàn)實時曲線圖,文中講解非常細(xì)致,代碼幫助大家更好參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 簡單介紹C# 中的擴展方法

    簡單介紹C# 中的擴展方法

    這篇文章主要介紹了C# 中的擴展方法的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評論

平塘县| 大埔区| 揭东县| 罗源县| 宣恩县| 岱山县| 黄山市| 鄄城县| 江山市| 抚远县| 延边| 新巴尔虎右旗| 永顺县| 青阳县| 阳泉市| 祥云县| 和平县| 德安县| 达拉特旗| 张掖市| 临夏县| 华亭县| 高安市| 屯留县| 梓潼县| 鄂伦春自治旗| 苏尼特左旗| 武强县| 荥阳市| 剑河县| 象山县| 重庆市| 芮城县| 卫辉市| 泽州县| 漳浦县| 三穗县| 时尚| 隆回县| 共和县| 顺义区|