没有 entity framework 的带有 mvc 的存储库模式

Repository pattern with mvc without entity framework

具有工作单元的存储库模式是否最适合 entity framework 应用程序?

我正在创建一个新的 asp.net mvc 应用程序,我想使用存储过程(微软企业库)而不是 Entity framework(或任何其他 ORM)。

那么我如何在 mvc 应用程序中使用存储库模式?

我浏览了很多教程,但没有得到预期的结果。请建议我更好的 n 层应用程序方法。

你要明白,"repository pattern"只是组织代码的一种想法。我认为您仍然可以毫无问题地使用它。

我只是想为您提供一个使用sql 存储过程的实现示例:假设您要管理经典table "Contacts"。

您可以创建您的 UnitOfWork 合约:

public interface IContactsRepository {
 void AddContact(Contact c);
 void RemoveContact(Contact c);
 void UpdateContact(Contact c);
 void Search(string keyword);
}

之后,您可以在不使用 EF 的情况下创建自己的实现:

public sealed class SPContactsRepository : IContactsRepository {
 // Is just an exampl.e 
 public void AddContact(Contact c) {
   var sqlCommnad = new SqlCommand(this._connectionString);
   sqlCommand.CommandText = "dbo.AddContact";
   sqlCommand.CommandType = CommandType.StoredProcedure;
   sqlCommand.AddParameter("Name", c.Name);
   sqlCommand.Connection.Open();
   sqlCommand.ExecuteNonQuery();

 }
}

希望对您有所帮助!

因此,为了继续 Roberto 已经开始的工作,您在 MVC 应用程序中的控制器将如下所示:

public class ContactsController : Controller
{
    private readonly IContactsRepository _contactsRepo;

    public ContactsController(IContactsRepository repo)
    {
        _contactsRepo = repo;
    }
}

这些模式使用了依赖注入(DI)。 DI 容器有多种选择。您可以使用 Unity,它是一个 Microsoft 包,您可以通过 nuget 包管理器将其安装到您的 MVC web 项目中。安装将在您的 App_Start 文件夹中创建一个 UnityConfig.cs 文件。您可以将依赖项注册为:

public static void RegisterComponents()
{
    var container = new UnityContainer();
    container.RegisterType<IContactsRepository, SPContactsRepository>();
}

然后在 Application_Start() 内的 Global.asax.cs 文件中初始化容器:

UnityConfig.RegisterComponents();

如果您使用 EF,DbContext 已经是您的工作单元,而 DbSet 已经是您的存储库。话虽如此,您不应该创建一个会添加另一层数据抽象的存储库。相反,您可以创建域服务。