분석 의존 주입 프레임 워 크 Autofac 사용
Autofac 는 다른 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 및 Oracle Database.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
builder.RegisterType
using (var container = builder.Build())
{
var manager = container.Resolve
manager.Search("SELECT * FORM USER");
}
실행 결과:
분석:
이 곳 은 Container Builder 방법 인 Register Type 을 통 해 DatabaseManager 를 등록 합 니 다.등 록 된 유형 이 해당 되 는 용기 에서 DatabaseManager 인 스 턴 스 를 Resolve 할 수 있 습 니 다.
builder.RegisterType<SqlDatabase>().As<IDatabase>();
AS 를 통 해 DatabaseManager 클래스 에서 구조 함 수 를 통 해 주입 유형 에 해당 하 는 인터페이스 에 의존 할 수 있 습 니 다.Build()방법 은 Container 인 스 턴 스 를 생 성 합 니 다.그러면 Resolve 를 통 해 등 록 된 유형의 인 스 턴 스 를 분석 할 수 있 습 니 다.
마찬가지 로 데이터베이스 형식 을 수정 하면 다음 과 같이 등록 합 니 다.
builder.RegisterType<OracleDatabase>().As<IDatabase>();
실행 결과: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.Section Handler 설정 노드 를 통 해 구성 요 소 를 처리 합 니 다.대응 하 는 클 라 이언 트 프로그램 변경:
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)등록 방법 을 통 해 등록 하 는 방법 도 있다.
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 ...");
}
실행 결과:분석:
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" };
실행 결과:이 사용자 가 조작 할 수 있 는 권한 이 없다 는 것 을 설명 합 니 다.
이상 이 바로 본문의 전체 내용 이 니 여러분 이 좋아 하 시 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
분석 의존 주입 프레임 워 크 Autofac 사용다음은 코드 를 통 해 주입 프레임 워 크 Autofac 에 의존 하 는 사용 을 공유 합 니 다.구체 적 으로 다음 과 같 습 니 다. 1)압축 패 키 지 를 압축 해제 합 니 다.주로 Autofac.dll,Aut...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.