具有工作单元的存储库模式最适合实体框架应用吗?
我正在创建一个新的asp.net mvc应用程序,我想使用存储过程(微软企业库)而不是实体框架(或任何其他ORM)。
那么如何在mvc应用程序中使用存储库模式呢?
我已经探索了很多教程但没有得到预期的结果。请建议我更好的方法进行n层申请。
答案 0 :(得分:5)
您必须了解"存储库模式"只是组织代码的想法。我想你仍然可以毫无问题地使用它。
我只是想为您提供一个使用sql存储过程实现的示例:假设您必须管理经典表" 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();
}
}
希望这可以提供帮助!
答案 1 :(得分:4)
所以,为了继续Roberto已经开始的,你在MVC应用程序中的控制器将如下所示:
public class ContactsController : Controller
{
private readonly IContactsRepository _contactsRepo;
public ContactsController(IContactsRepository repo)
{
_contactsRepo = repo;
}
}
这些模式使用依赖注入(DI)。 DI容器有多种选择。您可以使用Unity,它是一个Microsoft软件包,您可以通过nuget软件包管理器安装到您的MVC Web项目中。安装将在UnityConfig.cs
文件夹中创建App_Start
文件。您可以将依赖关系注册为:
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<IContactsRepository, SPContactsRepository>();
}
在Global.asax.cs
内的Application_Start()
文件中,您初始化容器:
UnityConfig.RegisterComponents();
答案 2 :(得分:0)
如果使用EF,则DbContext已经是您的工作单元,DbSet已经是您的存储库。话虽如此,您不应该创建一个将添加另一层数据抽象的存储库。相反,您可以创建域服务。