2017-12-13 9 views
0

ユニティコンテナを使用しています.IOCコンテナにクラスを登録しています。 Authクラスのインスタンスを作成しようとしているときに、次の例外が発生しています。 例外:InvalidOperationException - 現在のタイプlog4net.ILogがインタフェースであり、構築できません。型マッピングがありませんか?例外:InvalidOperationException - 現在のタイプlog4net.ILogはインタフェースであり、構築できません。型マッピングがありませんか?

私は何か間違っていると教えてください?

マイコード:

using Unity; 
    Public Main() 
    { 
    private readonly IUnityContainer container; 
    public override void Instantiate() 
    { 
     container.RegisterSingleton<IAuthentication, Auth>("Auth"); 
    } 

    public Authenticate() 
    { 
     var instance = container.Resolve<IAuthentication>("Auth");**//Getting exception here** 
    } 
    } 

認証クラス:

public class Auth: IAuthentication 
    { 
     private readonly ILog log; 
     private IImpID impIDobj; 
     public Auth(ILog log, IImpID impIDobj) 
     { 
      this.impIDobj= impIDobj; 
      this.log = log; 
     } 

     public Auth() 
      : this(LogManager.GetLogger("Auth"), new CAuth()) 
     { 
     } 
     public Authenticate() 
     { 
      impIDobj.Authenticate(data); 
     //Some logics 
     } 
    } 
+0

全例外:例外は次のとおりです。InvalidOperationExceptionが - 現在のタイプ、log4net.ILogは、インタフェースであり、構築することができません。型マッピングがありませんでしたか?例外時に、コンテナは次のとおりです。 Auth.IAuthenticationの解決[]、(なし) Auth.IAuthentication、Authの解決 ImpID.Auth、Authの解決 コンストラクタImID.Auth(log4net.ILog log、IImpID impIDobj) log4net.ILogの解決(none) –

+0

追加情報がある場合は、質問を編集し、コメントには入れないでください。 – juharr

+1

ロギングコンポーネントはどこに登録しましたか? – Amy

答えて

0

おかげで、あなたのすべてのフィードバックのために。しかし、私はこの問題を "InjectionConstructor"で解決することができます。詳細はhereです。

私の新しい認証クラス:

public class Auth: IAuthentication 
{ 
    private readonly ILog log; 
    private IImpID impIDobj; 
    public Auth(ILog log, IImpID impIDobj) 
    { 
     this.impIDobj= impIDobj; 
     this.log = log; 
    } 

    [InjectionConstructor] 
    public Auth() 
     : this(LogManager.GetLogger("Auth"), new CAuth()) 
    { 
    } 
    public Authenticate() 
    { 
     impIDobj.Authenticate(data); 
    //Some logics 
    } 
} 
1

コンテナのILogの型が何であるかを知っているdoesntの、および認証のインスタンスを作成します傾けます。 ILogのタイプを指定して、インスタンス化メソッドにこのラインを追加してください。

container.RegisterSingleton<ILog, yourOwnLogType>();

関連する問題