我相信,从最近几天开始,我就致力于实施Repository Pattern和UnitOfWork,并且已经完成了很长时间。我相信有很多方法可以实现这一点,但是我很感兴趣的是找到最佳方法。
我正在使用Visual Studio 2013用ASP.NET MVC 5编码的非常简单的示例。我主要的问题重点是UnitOfWork的实现。是否建议对每个业务使用多个UnitOfWorks,以私有方式实现存储库功能并为控制器提供公用功能,以供使用??
我通过通用存储库在控制器类中具有函数表(SQL Server)。我有IGenericRepository具有IQueryable一个功能,我有GenericRepository类,我在其中实现此接口。我有从BaseContext继承的FunctionContext。我之所以拥有baseContext,是因为所有dbcontexts都可以使用一条路径来访问数据库,但同时将表的数量限制为业务需要。
现在在我的身边;
在下面的程序中,所有我正在得到功能标题列表并传递给控制器进行打印
public interface IGenericRepository<TEntity> : IDisposable
{
IQueryable<TEntity> GetAll();
}
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
protected DbSet<TEntity> _DbSet;
private readonly DbContext _dbContext;
public GenericRepository()
{
}
public GenericRepository(DbContext dbContext)
{
this._dbContext = dbContext;
_DbSet = _dbContext.Set<TEntity>();
}
public IQueryable<TEntity> GetAll()
{
return _DbSet;
}
public void Dispose()
{
}
}
public class BaseContext<TContext> : DbContext where TContext : DbContext
{
static BaseContext()
{
Database.SetInitializer<TContext>(null);
}
protected BaseContext()
: base("name = ApplicationDbConnection")
{ }
}
public class FunctionsContext : BaseContext<FunctionsContext>
{
public DbSet<App_Functions> Functions { get; set; }
}
[Table("Functions")]
public class App_Functions
{
public App_Functions()
{
}
[Key]
public int Function_ID { get; set; }
[StringLength(50)]
[Required]
public string Title { get; set; }
public int Hierarchy_level { get; set; }
}
public class Functions
{
public Functions()
{
}
public int Function_ID { get; set; }
public string Title { get; set; }
public int Hierarchy_level { get; set; }
}
public class Function_UnitOfWork
{
private GenericRepository<App_Functions> _function_Repository = new GenericRepository<App_Functions>(new FunctionsContext());
public Function_UnitOfWork()
{
}
private List<Functions> getAllFunctionsFromRepository()
{
List<Functions> query = new List<Functions>();
query = _function_Repository.GetAll().Select(x => new Functions
{
Function_ID = x.Function_ID,
Title = x.Title,
Hierarchy_level = x.Hierarchy_level
}).ToList();
return query;
}
public List<Functions>GetAllFunctions()
{
return getAllFunctionsFromRepository();
}
}
public class HomeController : Controller
{
public ActionResult Index()
{
Function_UnitOfWork UOF = new Function_UnitOfWork();
var a1 = UOF.GetAllFunctions();
foreach(var item in a1)
{
var b1 = item.Title;
}
return View();
}
}
尽管基于意见,但仅工作单位模式的名称表明对象的时间有限。所以在控制器中使用它应该像
public ActionResult Index()
{
using(var UOF = new Function_UnitOfWork()) {
var a1 = UOF.GetAllFunctions();
foreach(var item in a1)
{
var b1 = item.Title;
}
}
return View();
}
简而言之,我们使用的一种方法是
public class DataObject { }
public class Repo: IRepo<T> where T: DataObject
public class RepoController<T> : Controller where T: DataObject {
protected IRepo<T> Repo;
}
因此,控制器将是通用的,并将具有用于特定回购的字段
您将使用一些依赖项注入工具,例如ninject或mef来绑定具有回购协议的控制器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句