国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 01:34:49
字體:
供稿:網(wǎng)友

下面通過代碼給大家分享下依賴注入框架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進行注冊,當注冊的類型在相應得到的容器中可以Resolve你的DatabaseManager實例。

復制代碼 代碼如下:

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

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

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

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

復制代碼 代碼如下:

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

運行結(jié)果:

image

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

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

對應的客戶端程序改為:

復制代碼 代碼如下:

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方法進行注冊:

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

分析:

復制代碼 代碼如下:

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

運行結(jié)果:

image

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高邑县| 黄平县| 民乐县| 南开区| 南投县| 株洲市| 丹阳市| 贵州省| 珠海市| 西贡区| 来宾市| 台南市| 瑞金市| 乐至县| 视频| 白山市| 凉山| 崇州市| 潼南县| 醴陵市| 南城县| 米脂县| 商水县| 枣强县| 德保县| 平利县| 新宾| 博客| 邮箱| 东乌| 阿勒泰市| 二手房| 邯郸市| 宜宾市| 宜阳县| 曲阳县| 清丰县| 南川市| 从江县| 丽水市| 安福县|