これは古くからの質問のようですが、探しているものが見つからないことがあります。ここで私が試したことで私の現在のコードです。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に直接関連するインスタンス化されたプロパティが既に存在するため、これは本当に面倒です。アクセスする方法はわかりません。私はそれを再度インスタンス化する必要はありません。あなたが反射して取得するすべての実行時例外ではなく、時間の例外をコンパイルしているので
リポジトリは一般的ですか?あなたのIoCコンテナは何ですか? DIをやろうとしているのであれば、IRepositoryを入力パラメータとして渡すだけではどうですか?私はあなたが本当にあなたのサービスロケータを使用する必要がある場合、これを実際にやろうとはしません。Activator.CreateInstanceを使用しないでください。 –
私のリポジトリは一般的で、ApplicationDbContextを取ります.. IoCはMVCコアによって処理されます。この関数はコントローラレベルで呼び出されるため、Tのリポジトリ全体での送信は理想的ではありません。サービスロケータを調べます! –
あなたはどういう意味ですか?Tのリポジトリ全体を送信するのは理想的ではありませんか?とにかくリファレンスを渡しているだけです...もし 'Repository 'をお持ちの場合は 'ConfigureServices'で' services.AddSingleton'でそれを渡すべきです –