분석 의존 주입 프레임 워 크 Autofac 사용

9948 단어 autofac의존 주입
다음은 코드 를 통 해 주입 프레임 워 크 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().As();
using (var container = builder.Build())
{
    var manager = container.Resolve();
    manager.Search("SELECT * FORM USER");
}
실행 결과:
image
분석:
이 곳 은 Container Builder 방법 인 Register Type 을 통 해 DatabaseManager 를 등록 합 니 다.등 록 된 유형 이 해당 되 는 용기 에서 DatabaseManager 인 스 턴 스 를 Resolve 할 수 있 습 니 다.

builder.RegisterType<SqlDatabase>().As<IDatabase>();
AS 를 통 해 DatabaseManager 클래스 에서 구조 함 수 를 통 해 주입 유형 에 해당 하 는 인터페이스 에 의존 할 수 있 습 니 다.
Build()방법 은 Container 인 스 턴 스 를 생 성 합 니 다.그러면 Resolve 를 통 해 등 록 된 유형의 인 스 턴 스 를 분석 할 수 있 습 니 다.
마찬가지 로 데이터베이스 형식 을 수정 하면 다음 과 같이 등록 합 니 다.

builder.RegisterType<OracleDatabase>().As<IDatabase>();
실행 결과:
image
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");
}
실행 결과:
image
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 ..."); 
}

실행 결과:
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" };
실행 결과:
image
이 사용자 가 조작 할 수 있 는 권한 이 없다 는 것 을 설명 합 니 다.
이상 이 바로 본문의 전체 내용 이 니 여러분 이 좋아 하 시 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기