2016-04-12 20 views
4

を発行し、私はIServiceHandlerISalesHandlerを持っているとの両方がIhandlerインターフェイスの継承が

IHandler.cs

public interface IHandler 
{ 
    Task AddAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId); 
    Task AddAuditAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId); 
} 

から継承IServiceHandler.cs

public interface IServiceHandler : IHandler 
{ 
    Task<IEnumerable<ACService>> GetAsync(); 
    Task<IEnumerable<ACServiceAudit>> GetAuditAsync(); 
} 

ISalesHandler.cs

public interface ISalesHandler : IHandler 
{ 
    Task<IEnumerable<ACSale>> GetAsync(); 
    Task<IEnumerable<ACSaleAudit>> GetAuditAsync(); 
} 

それから私はセールスやサービスのいずれかを返しますが、問題は、私はIHandler私だけを引き起こし

private IHandler CreateHandler(FileType type) 
{ 
    switch (type) 
    { 
     case FileType.Sales: 
      return _container.GetExportedValue<ISalesHandler>("Sales"); 
     case FileType.Service: 
      return _container.GetExportedValue<IServiceHandler>("Service"); 
     case FileType.None: 
      return null; 
    } 
    return null; 
} 

としてそれを返すいた方法を持っていますIHandlerのメソッドにアクセスし、IServiceHandlerまたはISalesHandlerにはアクセスしません。

すべてのメソッドにアクセスできるようにインターフェイスを構成するにはどうすればよいですか?私はCreateHandlerメソッドを保つことを好むでしょう。

+0

どのようにコンパイラが返されることになるだろうされたタイプを知ることを期待しますか? 'CreateHandler(FileType.Sales)'を呼び出すと、コンパイラはメソッド本体を調べず、 'ISalesHandler'を返すので、GetAsyncは' Task > 'を返します。基本的に、コンパイル時の情報と実行時の情報を区別する必要があります。「CreateHandler」のパラメータの値は実行時の情報なので、コンパイル時の情報には影響しません。 –

+0

おそらく、インターフェイスとCreateHandlerの両方のメソッドを汎用化する方が良いでしょう。そして、switch文を使わずに、必要なものを取り戻すことができます。 – Baldrick

+0

Createhandlerメソッドに型パラメータを渡すか(ISHviceHandlerとしてのIHandler) –

答えて

4

確かに、あなたはIHandlerを返すので、そこで定義されたメソッドはキャスティングなしでアクセス可能です。

派生ハンドラにパターンがあるように思われるので、ジェネリックを使用してこれをすべて回避することは可能だと思います。

これはあなたのためですか?

IHandler.cs

public interface IHandler // I usually split the generic and non-generic methods 
{ 
    Task AddAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId); 
    Task AddAuditAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId); 
} 

public interface IHandler<TService, TServiceAudit> : IHandler 
{ 
    Task<IEnumerable<TService>> GetAsync(); 
    Task<IEnumerable<TServiceAudit>> GetAuditAsync(); 
} 

IServiceHandler.cs

public interface IServiceHandler : IHandler<ACService, ACServiceAudit> 
{ } 

ISalesHandler.cs

public interface ISalesHandler : IHandler<ACSale, ACSaleAudit> 
{ } 
+0

あなたの返事をお寄せいただきありがとうございます。素早く見て、すぐに質問していますので、あなたのように見えるようにインターフェイスを変更しても、私はそれをCreateHandlerメソッドで持っていました。私はIhandlerを返すと私は同じ問題を抱えていると思いますから? – R4nc1d

3

何ジェネリックインターフェイスの使用について

public interface IServiceHandler<TSale, TAudit> : IHandler 
{ 
    Task<IEnumerable<TSale>> GetSaleAsync(); 
    Task<IEnumerable<TAudit>> GetAuditAsync(); 
} 

私はちょうどあなたのGetAsync()GetSaleAsync()にはより明確にするために名前を変更し、それはあなたが望むようです。 は、このようにあなたのFactoryは、次のシグネチャを持つことができます:

private IServiceHandler<TSale, TAudit>CreateHandler(FileType type) 
関連する問題