亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間: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,這也是本篇文章重點(diǎn)使用的Autofac的類庫。

2)創(chuàng)建一個(gè)控制臺(tái)工程,并且引用以上的DLL文件。創(chuàng)建一個(gè)數(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)建一個(gè)數(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)在控制臺(tái)中,編寫以下測試程序:

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

運(yùn)行結(jié)果:

image

分析:

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

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

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

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

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

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

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

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

運(yùn)行結(jié)果:

image

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

Autofac自帶了一個(gè)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é)點(diǎn)對組件進(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");
}

運(yùn)行結(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)在我想通過一個(gè)用戶類來控制操作權(quán)限,比如增刪改的權(quán)限,創(chuàng)建一個(gè)用戶類:

/// <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ù)中增加了一個(gè)參數(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 ..."); 
}

運(yùn)行結(jié)果:

image

分析:

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

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

DatabaseManager實(shí)例。

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

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

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

運(yùn)行結(jié)果:

image

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

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

相關(guān)文章

最新評論