2014-09-09 2 views
0

내 Apphost에 OrmLiteConnectionFactory를 만들고 두 개의 "ConnOne"및 "ConnTwo"라는 이름의 연결을 RegisterConnection을 통해 추가했습니다. 실행 시까 지 해결되지 않을 서비스의 속성을 기반으로 둘 중 하나를 교환 할 수 있습니다.런타임시 서비스에서 명명 된 OrmLiteConnectionFactory를 해결하는 방법은 무엇입니까?

var factory = new OrmLiteConnectionFactory(); 
     factory.RegisterConnection("ConnOne", Config.SqlServerTenantOne, SqlServerDialect.Provider); 
     factory.RegisterConnection("ConnTwo", Config.SqlServerTenantTwo, SqlServerDialect.Provider); 



public class Repository : IDisposable { 

    public string Tenant { get; set; } 

    public IDbConnectionFactory DbFactory { get; set; } //not injected 

    IDbConnection db; 
    IDbConnection Db 
    { 
     get 
     { 
      return db ?? db = DbFactory.OpenDbConnection(Tenant); //DbFactory is null 
     } 
    } 

    public List<Todo> GetByIds(long[] ids) 
    { 
     return Db.Ids<Todo>(ids); 
    } 

    public void Dispose() { 
     if (db != null) 
      db.Dispose(); 
    } 
} 

그러나 이것을 실행할 때 DbFactory는 항상 null입니다. 이것에 접근하는 가장 좋은 방법은 무엇입니까?

이 스티븐에게, 조정 될 필요가

답변

0

세 가지 항목 주셔서 감사합니다 :

1) 공장의 서명을 변경, 그것은 OrmLiteConnectionFactory 매개 변수가없는 생성자를 사용하기 전에 DialectProvider을 설정하는 것이 중요합니다.

OrmLiteConfig.DialectProvider = PostgreSQLDialectProvider.Instance; 

var dbFactory = new OrmLiteConnectionFactory(); 

dbFactory.RegisterConnection("NamedKeyConnOne", 
         new OrmLiteConnectionFactory(Config.TenantOne)); 
dbFactory.RegisterConnection("NamedKeyConnTwo", 
         new OrmLiteConnectionFactory(Config.TenantTwo)); 

2) 공장

container.Register<IDbConnectionFactory>(dbFactory); 

3) OpenDbConnection 방법을 사용하고 "NamedKey"전달 등록이 올바른 연결을 반환합니다.

public abstract partial class BorrowerRepository : IDisposable 
{ 
    private IDbConnection _db; 

    /// <summary> 
    /// This should be set to the string - Tenant 
    /// </summary> 
    public string TenantKey { get; set; } 

    public IDbConnectionFactory DbFactory { get; set; } 

    public IDbConnection Db 
    { 
     get 
     { 
      if (String.IsNullOrEmpty(TenantKey)) 
      { 
       throw new ArgumentException("The TenantKey property has to be set before using the DbFactory."); 
      } 
      return _db ?? (_db = DbFactory.OpenDbConnection(TenantKey)); 
     } 
    } 

    public virtual void Dispose() 
    { 
     if (_db == null) 
      return; 
     _db.Dispose(); 
    } 
}