분석 의존 주입 프레임 워 크 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);
}
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); 
  }
}
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>();
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>
대응 하 는 클 라 이언 트 프로그램 변경:
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; } 
}
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 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     
만약 여기에서 내 가 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에 따라 라이센스가 부여됩니다.