2

을 사용하여 을 열어 두지 않고 SqlConnection으로 매핑하려고합니다. DB를 사용하려고 할 때Ninject : DbConnection을 묻는 메시지가 표시 될 때 열려 있지 않은 SqlConnection을 제공하십시오.

string constr = @"Server=.\SQLEXPRESS; Trusted_Connection=True; Database=TestDB"; 

Bind<DbConnection>().To<SqlConnection>() 
    .Using<OnePerRequestBehavior>() 
    .WithConstructorArgument("connectionString", constr); 

는 그러나, 나는

이 작업은 '마스터'데이터베이스에 대한 연결이 필요 없다는 오류가 발생합니다 : 이것은 내가 한 일이다. 원래 데이터베이스 연결이 열리고 연결 문자열에서 자격 증명이 제거 되었기 때문에 '마스터'데이터베이스에 대한 연결을 만들 수 없습니다. 미개봉 된 연결부를 제공하십시오.

그것은 내가 Ninject에 의해 부여 된 SqlConnectionQueryString 속성이 비어 을 밝혀

(난 그냥 new SqlConnection(constr)와의 연결을 제공하는 경우에도 동일한 작업을 ... 작동). 내가 도대체 ​​뭘 잘못하고있는 겁니까?


UPDATE는

지금은 직접 바인딩 후 kernel.Get<DbConnection>() 테스트했으며, 위의 코드와는 여전히 나에게 빈 연결 문자열을 제공합니다. 더 자세한하지만 다음 작품은, 내가 원하는 것보다 :

Bind<DbConnection>().ToMethod<SqlConnection>(ctx => GetConnection()); 

private SqlConnection GetConnection() 
{ return new SqlConnection(constr); } 

업데이트 2

이 내 전체 모듈 :

public class MsSqlModule : StandardModule 
{ 
    private string constr = @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test";// System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; 

    public override void Load() 
    { 
     Bind<DbConnection>().To<SqlConnection>().WithConstructorArgument("connectionString", constr); 
     var test = Kernel.Get<DbConnection>(); 
     test.Dispose(); 
    } 
} 

var test = Kernel.Get<DbConnection>();에 중단 점으로 그리고 스텝 오버하면 testSqlConnection이 채워지지만 ConnectionString 프로로 표시됩니다. 퍼티가 비어 있습니다.

+0

당신은'** Query ** String'을 의미하지 않습니까? –

+0

이것이 유일한 Bind 호출입니까? 그렇다면'Get ()'이 arg 전달에 실패 할 수있는 경우를 보지 못한다면 [ctor의 기본값이 아닌 과부하를 선택하십시오]. –

+0

당신은'Bind' 시점에서'constr'가 초기화되어 있는지 확인 하시겠습니까? –

답변

0

사용자 지정 공급자를 만들고 바인딩하여이 문제를 해결했습니다.

following 블로그에이 발견 .... 약간 늦게

public class MsSqlConnectionProvider : DbConnectionProvider<SqlConnection> 
{ 
    public string ConnectionString { get { return TestConnectionString; } } 
    public string ConnectionStringFromConfigFile { get { return System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; } } 
    public string TestConnectionString { get { return @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test"; } } 

    protected override SqlConnection CreateInstance(IContext context) 
    { 
     return new SqlConnection(ConnectionString); 
    } 
} 

public class MsSqlModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<DbConnection>().ToProvider<MsSqlConnectionProvider>(); 
    } 
} 
0

코드는 괜찮아 보입니다. Ninject는 DBConnection을 요청하면 큰 소리로 바인딩을 사용하거나 comnplain을 사용해야합니다.

ImplicitSelfBinding은 (는) 스테핑 중이십니까? 너는 그걸 꺼둘 수있어 Module? (그러나 일어날 수 있으려면 SqlConnection을 주입해야합니다.)

Bind 라인 바로 다음에 Get<DBConnection>()을 수행하면 어떻게됩니까?

+0

결과로 내 질문을 업데이트했습니다. ImplicitSelfBinding을 어떻게 제어합니까? (하지만 아냐, 나는'DbConnection'을 주입 중이다 ...) –

+0

ImplicitSelfBindingDefault는 Module에 전달된다. 모듈의 ImplicitSelfBinding 소품을 보면 상태를 볼 수 있습니다. 그것은 클래스 X가 X에 바인딩된다는 것을 의미합니다 (즉, 아마도 여러분의 경우와 아무런 상관이 없습니다 - 그것이 켜져 있고 Bindings가 없다면 Ninject가 SqlConnection을 얻을 수 있도록 허용하고 디폴트로 생성됩니다). 당신은 확실히 DBConnection을 해결할 것입니다, 그것은 뛰어 들어가서 당신의 등 뒤에 무언가가 기본으로 구축 된 SqlConnection을 제공하지 않을 것입니다) –

0

(나는 또한 ... 결과에 영향을 미칠 수있는, Ninject에 2.0으로 업그레이드 한), 그러나.

그냥 추가 :

진정한 보안 정보 =을 지속 ... 연결 문자열에. 나를 위해 일했다.