依存注入フレームワークAutofacの簡単な使用
AutofacはIOCの枠組みであり、Springのような他のIOCの枠組みと比較されている.NET、Unity、Castleなどに含まれる軽量級の性能も高い.
そこで、今日は暇を見つけて研究しました.ダウンロード先:http://code.google.com/p/autofac/downloads/list
1)圧縮パッケージを解凍し、主にAutofacを見る.dll,Autofac.Configuration.dll、これも本編で重点的に使用したAutofacのクラスライブラリです.
2)コンソールエンジニアリングを作成し、上記のDLLファイルを参照します.データベース操作インタフェースIDatabaseを作成する.cs:
ここにはCRUDの4つの操作方法が含まれています.
3)2種類のデータベースの操作クラス、SqlDatabaseを作成する.csおよびOracleDatabase.cs:
および
4)次にデータベースマネージャDatabaseManagerを作成する.cs:
5)コンソールで、次のテストプログラムを作成します.
実行結果:
分析:
ここでContainerBuilderメソッドRegisterTypeでDatabaseManagerを登録します.登録されたタイプが対応するコンテナにある場合、DatabaseManagerインスタンスをResolveできます.
builder.RegisterType().As();ASを使用すると、DatabaseManagerクラスのコンストラクション関数を使用して、注入タイプに対応するインタフェースに依存できます.
Build()メソッドは、対応するContainerインスタンスを生成し、登録されたタイプのインスタンスをResolveで解析できます.
同様に、データベース・タイプを変更して次のように登録します.
builder.RegisterType().As();
実行結果:
6)上記のプログラムでは、SqlDatabaseまたはOracleDatabaseがクライアントプログラムに露出していることは明らかですが、このタイプの選択をファイル構成で読み込みたいと思います.AutofacにはAutofacが付属しています.Configuration.dllはタイプを容易に構成し、プログラムの再コンパイルを回避します.
Appを変更します.config:
Autofac経由Configuration.SectionHandler構成ノードは、コンポーネントを処理します.
対応するクライアント・プログラムは次のように変更されました.
実行結果:
7)Registerメソッドで登録する方法もあります.
結果を得たのも同じだ.
8)ユーザー・クラスを使用して、削除権限を追加してユーザー・クラスを作成するなど、操作権限を制御したいと思います.
DatabaseManagement.の変更csコード:
コンストラクション関数にはパラメータUserが追加され,Add,Save,Removeには権限判定が追加された.
クライアントプログラムの変更:
実行結果:
分析:
builder.RegisterInstance(user).As();Userインスタンスを登録します.
builder.Register(c => new DatabaseManager(c.Resolve(), c.Resolve()));Lampda式でDatabaseManagerインスタンスを登録します.
ここでUserのプロパティ値を変更するとします.
User user = new User { Id = 2, Name = "zhangsan"};
実行結果:
ユーザーに権限がないことを示します.
オリジナルソースのダウンロード:http://download.csdn.net/detail/liuweitoo/4747173
本人が書いたソースコード(データベース部分を複数のクラスライブラリに分解)をダウンロードします.http://download.csdn.net/detail/liuweitoo/4747257
変換元:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html
そこで、今日は暇を見つけて研究しました.ダウンロード先:http://code.google.com/p/autofac/downloads/list
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の4つの操作方法が含まれています.
3)2種類のデータベースの操作クラス、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");
}
実行結果:
分析:
ここでContainerBuilderメソッドRegisterTypeでDatabaseManagerを登録します.登録されたタイプが対応するコンテナにある場合、DatabaseManagerインスタンスをResolveできます.
builder.RegisterType
Build()メソッドは、対応するContainerインスタンスを生成し、登録されたタイプのインスタンスをResolveで解析できます.
同様に、データベース・タイプを変更して次のように登録します.
builder.RegisterType
実行結果:
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");
}
実行結果:
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; }
}
DatabaseManagement.の変更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 ...");
}
実行結果:
分析:
builder.RegisterInstance(user).As
builder.Register(c => new DatabaseManager(c.Resolve
ここでUserのプロパティ値を変更するとします.
User user = new User { Id = 2, Name = "zhangsan"};
実行結果:
ユーザーに権限がないことを示します.
オリジナルソースのダウンロード:http://download.csdn.net/detail/liuweitoo/4747173
本人が書いたソースコード(データベース部分を複数のクラスライブラリに分解)をダウンロードします.http://download.csdn.net/detail/liuweitoo/4747257
変換元:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html