C#对UnitOfWork / Generic Repositories的反思

时间:2017-02-17 16:12:34

标签: c# asp.net .net reflection

这似乎是一个古老的问题,但根本无法找到我正在寻找的东西。这是我目前使用我尝试过的代码的代码。

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 });
        }

看起来有点像鸡肉和鸡蛋,因为我可以发票&#34;创造&#34;似乎没有CreateInstance,因为IoC我无法做到。

这真的很烦人,因为我已经在_unitOfWork中获得了一个与我相关的GenericRepository直接相关的实例化属性,我只是无法弄清楚如何访问它?我甚至不必重新实例化它。

1 个答案:

答案 0 :(得分:2)

Rader然后使用反射(总是一个坏主意)我建议做这样的事情

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
        {

        }

因为您将通过反射得到的只是运行时异常而不是编译时异常。不需要反思。你的repo需要实现IDocumentLibraryCreator<T>接口,但如果你以一种好的方式做了IRepository,你应该已经有了这样的东西。 如果您需要在单个Unite of work中完成工作,则需要传递在uof类中创建的实例。