0

기본 데이터 소스에 액세스하려면 내가 가지고 있지 않은 현재 사용자 자격 증명을 제공해야합니다. ServiceLocator 방지 패턴을 피하는 방법은 무엇입니까?

그래서 적절한 현재 사용자 자격 증명을 사용하여 데이터 액세스 레이어를 제공하기 위해, 내 ConfigurationProviderthis answer에 따라 ICurrentUser InSingletonScope()의 인스턴스에 의존하는 것이 제안되었다.

내가 이해하는 방식으로, 나는 사용자를 인증하고 나중에 ICurrentUser을 바인딩하고 나머지 데이터 액세스 레이어를 바인딩하는 방법에 대해 확신해야합니다.

메인 MDI 폼에서 인증이 발생하므로 MDI 폼의 생성자에 Ninject 커널을 주입하는 것이 유일한 방법입니다.

내 관심사는 내가 본 것을 보는 방법에 관한 것이고, Ninject 커널 자체에 의존하는 것이 필수적이다. 이것은 의심의 여지가 없기 때문이다. 안티 패턴을 사용하는 것 같습니다.

따라서이 시나리오에서는 ServiceLocator 안티 패턴을 피하는 방법은 무엇입니까?

+0

이 봐 http://stackoverflow.com/questions/9021766/multitenancy-with-fluent-nhibernate-and-ninject-one-database-를 타고 임차인 당 하나의 동일한 문제를 설명합니다. 하지만 요점을 놓치고 있다고 생각합니다. 인증 양식에 IKernel이 필요하지 않습니다. 'CurrentUser.Instance'를 싱글 톤으로 접근하고'ServiceLocator'를 참조하지 마십시오. 하지만 이제 당신은'정적'으로 연결됩니다. :) 그러나 다시, 당신은이 'ICurrentUserAcessor'를 구현하고 내부 정적 액세스를 마스킹 할 수 있습니다! – cvbarros

답변

2

윌, 당신은 당신의 인증 형태로 IResolutionRoot에 액세스 할 필요가 없습니다

. 구성 중입니다. 양식에 IAuthenticationService을 삽입 한 샘플 구현을 생각해 냈습니다. 사용자 입력 후 SignIn()으로 전화를 걸면 현재 자격 증명 인스턴스가 변경됩니다.

그 이후부터는 IDatabaseUserCredentials이 필요한 클래스는 기본 인스턴스 대신이 인스턴스를 받게됩니다.

ConfigurationProviderstring 대신 IConnectionStringProvider이 표시되도록했습니다. 전체 작동 예제는 complete gist을 확인하십시오.

public class AuthenticationService : IAuthenticationService 
{ 
    public void SignIn(string dbInstance, string login, string password) 
    { 
     var user = new DatabaseUserCredentials(dbInstance, login, password); 

     // A single point to manipulate your singleton instance 
     DatabaseUserCredentials.Current = user; 
    } 
} 

그리고 바인딩 :

public override void Load() 
{ 
    Bind<Configuration>().ToProvider<ConfigurationProvider>(); 

    Bind<IAuthenticationService>().To<AuthenticationService>(); 

    Bind<IConnectionStringProvider>().To<ConnectionStringProvider>(); 

    //Use Current user if available. If not, use default credentials. 
    Bind<IDatabaseUserCredentials>().ToMethod(c => DatabaseUserCredentials.Current ?? DatabaseUserCredentials.Default); 
} 
+0

전혀 이해가되지 않는 것처럼 들리지만, 내 친구 (내가 그렇게 말할 수 있다면)! 나는 다음 주 초에 시도해 볼 것이고, 나는 당신에게 당신의 솔루션에 대한 피드백을 제공 할 것이다. 진심으로, 당신의 도움에 꽤 감사드립니다. 나는 정말로, 나는 정말로 그것을 의미하는 것을 의미한다. 고마워. –