无法使用类型创建抽象类或接口接口的实例

时间:2012-07-20 03:38:24

标签: c# interface

我知道这个错误是什么,我的问题略有不同。

这是这些大脑衰退时刻之一。

我一直在读这篇关于Repositoy和工作单元模式的有趣文章:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

我正在使用此代码,我现在正在尝试调整它,以便我可以将IoC与DI一起使用。

现在,我刚刚在这里找到了精神上的空白。

我正在更改所有类以使用接口等。所以给出了这段代码片段:

    public class UnitOfWork : IDisposable
    {
        private SchoolContext context = new SchoolContext();
        private GenericRepository<Department> departmentRepository;
        private GenericRepository<Course> courseRepository;

        public GenericRepository<Department> DepartmentRepository
        {
            get
            {

                if (this.departmentRepository == null)
                {
                    this.departmentRepository = new GenericRepository<Department>(context);
                }
                return departmentRepository;
            }
        }
    }
}

如何编辑此行:

this.departmentRepository = new GenericRepository<Department>(context);

所以我不必引用实际的类,所以我可以确保它被解耦并避免产生语法错误:

Cannot create an instance of the abstract class or interface interface with type

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

简而言之,您应该将该字段声明为接口类型。界面可以具有IGenericRepository<T>之类的名称。然后类GenericRepository<T>应该实现该接口。然后你用你的IoC框架注册这个类,它基本上告诉框架,“当我要求这个接口的实例时,给我一个该类的实例”。然后你做这样的事情:

this.departmentRepository = InversionOfControl.Resolve<IGenericRepository<Department>>();

(解析方法的签名类似于public T Resolve<T>()

答案 1 :(得分:0)

http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle

似乎GenericRepository是无法实例化的抽象类。

http://msdn.microsoft.com/en-us/library/sf985hc5(v=vs.71).aspx

您需要GenericRepository的派生类,即

DepartmentRepository : GenericRepository<Department>