2012-10-10 5 views
0

현재 등록중인 종속성을 삽입하려고 할 때 문제가 있습니다. 부트 스트랩 로더를 시작하여 설정 파일을 읽는 응용 프로그램이 있고이 설정 파일의 특정 값에서 리플렉션을 사용하여 개체를 만듭니다. 코드를 사용하여 여기에서 이야기하도록하겠습니다./다음 계약을 준수 BootstrapSettings라는 객체 직렬화 복원 직렬화Autofac - 'X'유형의 생성자가 없습니다.

설정

설정 파일은 일반 오래된 XML 파일입니다 파일 :이 설정 파일 내에서

public interface IBootstrapSettings 
{ 
    string Get(string key); 
    void Set(string key, string value); 
} 

, 나는 PlainTextEncryptor 또는 TDESEncryptor을 선택할 수있는 순간에 IEncryptor을이 응용 프로그램에 사용할 특정 키를 가지고 있는데, 후자는 설정 파일에서 암호를 읽습니다. 해당 생성자 설정 파일에서이 암호를 읽으려면 IBootstrapSettings의 인스턴스를 전달합니다. 현재 PlainTextEncryptor이 그것을 사용하지 않더라도 IBootstrapSettings의 인스턴스를 각 암호화 장치에 주입하고 있습니다. 리플렉션을 사용하여이 인스턴스를 만들 필요가 있기 때문에 매개 변수를 사용하지 않는 생성자와 IEncryptor 유형을 생성하는 생성자를 구별 할 수있는 방법을 모르기 때문에이 작업을 수행하고 있습니다 (하지만이 작업은 다른 작업입니다. 나는 생각한다). 다음

IEncryptor 생성자

내가 현재 가지고 각 IEncryptor의 생성자입니다.

public sealed class PlainTextEncryptor : IEncryptor 
{ 
    private readonly IBootstrapSettings _bootstrapSettings; 

    public PlainTextEncryptor(IBootstrapSettings bootstrapSettings) 
    { 
     _bootstrapSettings = bootstrapSettings; 
    } 
} 

public sealed class TDESEncryptor : IEncryptor 
{ 
    private readonly IBootstrapSettings _bootstrapSettings; 

    public TDESEncryptor(IBootstrapSettings bootstrapSettings) 
    { 
     _bootstrapSettings = bootstrapSettings; 
    } 
} 

내 종속성을 설정 해요 방법 상에, 사출

. 나는 다른 생성 아무것도하기 전에 부트 스트랩 종속성을 생성하는 Autofac 모듈이 - 그것은 다음과 같습니다 : 나는 IEncryptor의 인스턴스가 나는 오류를 얻고있다 .Resolve하려고 할 때

public sealed class BootstrapSettingsModule : Autofac.Module 
{ 
    private readonly string _filePath; 

    public BootstrapSettingsModule(string filePath) 
    { 
     _filePath = filePath; 
    } 

    protected override void Load(ContainerBuilder builder) 
    { 
     base.Load(builder); 

     builder.Register(c => new BootstrapSettings(_bootstrapSettingsPath)) 
      .As<IBootstrapSettings>() 
      .SingleInstance(); 

     builder.Register(c => (IEncryptor)Activator.CreateInstance(Type.GetType(c.Resolve<IBootstrapSettings>().Get("encryptionprovider")), args: new { bootstrapSettings = c.Resolve<IBootstrapSettings>() })) 
      .As<IEncryptor>() 
      .SingleInstance(); 
    } 
} 

이제이 잘 실행, 문제가 발생 유형이 '생성자가 무엇이든간에'생성자가 발견되지 않습니다.. Autofac이 내 IBootstrapSettings을 해결할 수 없기 때문에 그리고 내 IEncryptor에 기본 매개 변수없는 생성자가 없기 때문에 이것이 적합하다고 생각합니다.

여기서 무엇을 해야할지 모르겠지만, IBootstrapSettings을 단일 인스턴스로 지정하여 잘못된 작업을하고 있습니까? 아니면 Autofac의 바인딩을 올바르게 이해하지 못합니까? 언제나처럼 어떤 도움을 감사하십시오!

+0

encryptor 클래스의 생성자를 표시하십시오. –

+0

@DanielHilgarth가 생성자 코드로 업데이트되었습니다. –

답변

2

왜 내가 Autofac의 기능을 사용하지 않는지 이해할 수 없습니다.

protected override void Load(ContainerBuilder builder) 
{ 
    base.Load(builder); 

    var settings = new BootstrapSettings(_bootstrapSettingsPath); 
    builder.RegisterInstance(settings) 
     .As<IBootstrapSettings>() 
     .SingleInstance(); 

    var encryptorType = Type.GetType(settings.Get("encryptionprovider")); 
    builder.RegisterType(encryptorType) 
     .As<IEncryptor>() 
     .SingleInstance(); 
} 

이 당신이 모든 암호기의 IBootstrapSettings 매개 변수와 함께 생성자를 가질 필요가 없습니다 것 추가적인 이점을 줄 것이다. 이 매개 변수를 실제로 사용하는 경우에만 필요합니다.

+0

우수 !!나는 Autofac의 초보자이고, 내가 원하는 것을하기 위해 리플렉션 대신에'RegisterType'을 사용할 수 있다는 것을 알지 못했습니다. 이것은 완벽하게 고마워합니다! 그것은 3 분 안에 대답으로 받아 들일 수 있다고 말합니다. –

관련 문제