2017-02-17 3 views
0

これは古くからの質問のようですが、探しているものが見つからないことがあります。ここで私が試したことで私の現在のコードです。UnitOfWork/Generic RepositoriesのC#のリフレクション

private async Task<T> HandleFileCreate<T>(Guid tableId, IFormFile file, DocumentType documentType) 
      where T : DocumentLibrary 
     { 
      // This works fine and gets the correct type 
      Type repoType = _unitOfWork.GetType().GetProperty(typeof(T).Name + "Repository").PropertyType; 

      // This works fine and creates an instance of my document 
      T document = (T)Activator.CreateInstance(typeof(T)); 

      // Throws up error: "No parameterless constructor defined for this object." 
      object instance = Activator.CreateInstance(repoType); 

      // Throws up error: "Object does not match target type." 
      repoType.GetMethod("Create").Invoke(repoType, new object[] { document }); 
     } 

私はそれは私が原因のIoCを行うことができないのCreateInstance、なしと思われる「作成」を請求することができないので、それは少しの鶏と卵のようです。

_unitOfWorkでは、関連するGenericRepositoryに直接関連するインスタンス化されたプロパティが既に存在するため、これは本当に面倒です。アクセスする方法はわかりません。私はそれを再度インスタンス化する必要はありません。あなたが反射して取得するすべての実行時例外ではなく、時間の例外をコンパイルしているので

+1

リポジトリは一般的ですか?あなたのIoCコンテナは何ですか? DIをやろうとしているのであれば、IRepository を入力パラメータとして渡すだけではどうですか?私はあなたが本当にあなたのサービスロケータを使用する必要がある場合、これを実際にやろうとはしません。Activator.CreateInstanceを使用しないでください。 –

+0

私のリポジトリは一般的で、ApplicationDbContextを取ります.. IoCはMVCコアによって処理されます。この関数はコントローラレベルで呼び出されるため、Tのリポジトリ全体での送信は理想的ではありません。サービスロケータを調べます! –

+0

あなたはどういう意味ですか?Tのリポジトリ全体を送信するのは理想的ではありませんか?とにかくリファレンスを渡しているだけです...もし 'Repository 'をお持ちの場合は 'ConfigureServices'で' services.AddSingleton'でそれを渡すべきです –

答えて

2

その後、反射(常に悪いアイデア)を使用して、レーダー私はこの

public static T Create<T>(IDocumentLibraryCreator<T> repo)// You can add you params here 
      where T: DocumentLibrary, new() 
     { 
      var newItem = new T(); 

      repo.Create(newItem); 
//Do your stuff here 
      return newItem; 
     } 


     public interface IDocumentLibraryCreator<T> where T : DocumentLibrary 
     { 
      Task Create(T document); 
     } 

     public abstract class DocumentLibrary 
     { 

     } 

のようなものをやってお勧めします。反射の必要はありません。あなたのレポはIDocumentLibraryCreator<T>インターフェイスを実装する必要がありますが、IRepositoryをうまく実行した場合は、既にこのようなものを用意しておく必要があります。 単一のUnite of Workで作業を行う必要がある場合は、uofクラスで作成されたインスタンスを渡す必要があります。

+0

最後に、私はあなたの助言を受けて、汎用リポジトリを関数に送りました。治療をしました。ありがとう! –

関連する問題