我已经实现了以下代码,但不知道接口是怎么回事。我有两个项目:Project.Web和Project.Core。
在Project.Web中,我有一个Infrastructure命名空间,它实现了一个DataSource接口:
namespace Project.Web.Infrastructure
{
public class ProjectDataSource : DbContext, IProjectDataSource
{
public ProjectDataSource() : base("DefaultConnection") // 1) What is this constructor doing?
{
}
public DbSet<Set> Sets { get; set; }
public DbSet<Card> Cards { get; set; }
void IProjectDataSource.Save() // 2) This method isn't even defined in the interface, what value does it provide?
{
SaveChanges();
}
IQueryable<Card> IProjectDataSource.Cards // 3) This gets me a list of Cards, but from where?
{
get { return Cards; }
}
IQueryable<Set> IProjectDataSource.Sets
{
get { return Sets; }
}
}
}
现在,在Project.Core中我有IProjectDataSource,接口:
namespace Project.Core
{
public interface IProjectDataSource
{
IQueryable<Card> Cards { get; }
IQueryable<Set> Sets { get; }
IQueryable<Side> Sides { get; }
void Save();
}
}
在Web项目控制器中,我有这样的代码:
namespace Project.Web.Controllers
{
public class SetController : Controller
{
private readonly ProjectDataSource _db;
public SetController(ProjectDataSource db)
{
_db = db;
}
问题1-3在代码中,我的最后一个问题是4)最后一个代码块究竟发生了什么?为什么有一个SetController的构造函数使代码更少耦合?
任何有明显示例的指针都会有所帮助 - 我一直在努力理解接口,所以我可以开始在我的MVC应用程序中实现一个Service层,但是我有点挣扎。非常感谢。
答案 0 :(得分:0)
提供一个无参数构造函数,该构造函数调用基类(DbContext)构造函数,该构造函数接受单个字符串参数,并传递值“DefaultConnection”。 (您似乎使用的是Entity Framework Code First,我相信这会在配置文件中用作连接字符串的名称。)
我不明白这个问题 - 界面上是否定义了Save方法?
我相信Entity Framework Code First可以根据惯例在数据库中查询名为“Card”的表格。
按原样,它不会使代码更少耦合,您需要一个构造函数,它使IProjectDataSource
(接口)不是ProjectDataSource
(该接口的实现)。然后,您的代码不依赖于该具体实现,因此您可以将其替换为非常容易实现该接口的替代实现。 (如果在应用程序中使用依赖注入库(如Ninject)来满足依赖关系并创建控制器,则更容易实现。)
答案 1 :(得分:0)
关于问题2)和3) - .Save和.Cards在IProjectDataSource(您的自定义数据访问接口)和DbContext(您正在利用的基类)上定义。 它们都是公开的并且具有相同的签名。您希望确保通过IProjectDataSource而不是DbContext访问它们 - 因此是前面的IProjectDataSource。这是对接口进行编程的方法。 该功能来自DbContext,它是“基础”实现。
Jon已经回答了1和4。