我正在使用依赖注入编写web api,在存储库的帮助下工作单元和Autofac作为容器.依赖性在24小时前被完美注入,但突然间,当我今天开始工作时,我一直收到错误
"消息":"发生错误.","ExceptionMessage":"尝试创建'SearchController'类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.","ExceptionType":" System.InvalidOperationException"
我将包括我的签名以及我如何注册类型,如果有人可以指出我的代码可能出错,我将非常高兴.
在我的网络api控制器上,我有
private IUnitOfWork<Listing> _unitOfWork = null;
public SearchController(IUnitOfWork<Listing> unitOfWork)
{
_unitOfWork = unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
工作单元采用泛型类型参数来创建存储库.
在我的WebApiConfig.cs中,我正在注册以下类型
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency();
builder.RegisterType(typeof(SearchController)).UsingConstructor(typeof(IUnitOfWork<Listing>));
Run Code Online (Sandbox Code Playgroud)
我正在注册SearchController以使用接受IUnitOfWork <>的构造函数.在我添加Mocked单元测试之前一切正常,但出于某种目的,我现在继续得到这个错误.我还注册了DependencyResolver
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
Run Code Online (Sandbox Code Playgroud) c# dependency-injection unit-of-work autofac asp.net-web-api2
我看到几个与此有关的问题,但我仍然无法找到我正在寻找的答案,所以我发布了我的问题.如果另一个问题得到答案(我只是没有看到),请指出我.
我正在试图找出我的UnitOfWork所属的位置 - 特别是,在使用EF4和Unity与Repository模式时创建.
基本上,我有一个用于实现我的业务逻辑的服务.此服务构造函数接收存储库,因此服务将注入我的存储库.然后,该服务使用注入的存储库对数据存储执行操作 - 但我需要将它们包含在一个工作单元中.
但是,我的工作单元需要注入EF4上下文(或者,在我的情况下,和上下文的接口 - IObjectContext).而且我不确定UoW应该在哪里创建并注入上下文.
以下是我能想到的可能选项,其中没有一个看起来很理想:
在服务构造函数中包含UoW,从而使用工作单元注入服务,然后使用我的EF4上下文注入.但这似乎是错误的,因为我不想在存储库的每个实例上创建我的UoW.
使用container.Resolve进行按需创建以获取UoW的实例,注入我的EF4上下文.这似乎过于不得不经常点击IoC容器,而不是已经有权访问UoW.
将上下文直接注入服务,允许我创建UoW(上下文).这看起来很糟糕,因为我现在已经将上下文暴露给服务,这应该被隔离到存储库.
所以我的问题是,这些方法中的一种是可以接受的,还是有其他方法我没想到?
提前致谢.
entity-framework repository ioc-container unity-container unit-of-work
我仍然很难绕过这个.我想像我这样分开我的图层(dll):
1)MyProject.Web.dll - MVC Web App(控制器,模型(编辑/查看),视图)
2)MyProject.Services.dll - 服务层(业务逻辑)
3)MyProject.Repositories.dll - 存储库
4)MyProject. Domain.dll - POCO类
5)MyProject.Data.dll - EF4
工作流程:
1)控制器调用服务以获取对象以填充视图/编辑模型.
2)服务调用存储库来获取/持久化对象.
3)存储库调用EF以从SQL Server获取/持久化对象.
我的存储库返回IQueryable(Of T),在其中它们使用ObjectSet(Of T).
所以我看到这一点,图层完全依赖于下一层和包含POCO类的lib?
一些问题:
1)现在我的存储库与EF一起正常工作,它们将依赖于System.Data.Objects,现在我在我的存储库层与EF紧密耦合,那是不是很糟糕?
2)我正在使用UnitOfWork模式.那住哪儿?它有一个Property Context As ObjectContext,因此它也与EF紧密耦合.坏?
3)我如何使用DI使这更容易?
我希望这是一个松散耦合的测试.有什么建议?
----------编辑----------
如果我在这里正确的轨道,请告诉我.另外,因此服务器注入一个IRepository(Of Category)权限,它如何知道它与EFRepository(Of T)的具体类之间的区别?与UnitOfWork和服务相同?
一旦有人帮助我把它弄清楚到我所理解的地方,我知道它看起来似乎微不足道,但是男人,我有一个时间包围我的头!
调节器
Public Class CategoryController
Private _Service As Domain.Interfaces.IService
Public Sub New(ByVal Service As Domain.Interfaces.IService)
_Service = Service
End Sub
Function ListCategories() As ActionResult
Dim Model As New CategoryViewModel
Using UOW As New Repositories.EFUnitOfWork
Mapper.Map(Of Category, CategoryViewModel)(_Service.GetCategories)
End Using
Return …Run Code Online (Sandbox Code Playgroud) asp.net-mvc unit-of-work repository-pattern service-layer entity-framework-4
让我说,我已经得出结论(经过大量试验),使用实体框架时,存储库和工作单元是错误的,错误的,错误的,这就说明了为什么这么好.
但我真的很讨厌这些嵌入式查询.问题是,如果我是如此反对存储库等,我可以在哪里放置它们?(只有请干净的答案,非常感谢的例子).
我刚刚完成了两个包含我的存储库,工作单元和数百个文件接口的项目,因为回报无处可见.我认为很多人,包括我自己,只是跳上了Repository的潮流,因为这是其他所有人都在做的事情,但回想起来,我认为这真是一个无处可去的地方.
/叹
理查德
我试图将我的工作单元与我的服务或存储库分离,以便每当我想添加新服务时,我都不必触摸UoW代码.我该怎么做呢?
_categoryService = _unitOfWork.Get<ICategoryService>();
Run Code Online (Sandbox Code Playgroud)
而不是
_unitOfWork.CategoryService.Add(category)
Run Code Online (Sandbox Code Playgroud)
我可以说;
_categoryService.Add(category);
Run Code Online (Sandbox Code Playgroud) c# model-view-controller interface unit-of-work repository-pattern
我一直在寻找在我正在开发的项目中实现这些模式.UoW具有数据库上下文,然后使用该上下文实例化许多存储库.我的问题是处理上下文.我见过很多文章都将存储库作为IDisposable,然后处理上下文.这让我感到困惑,我错过了什么,或者(在我的情况下)是否只是处理上下文的UoW?另外,我应该在我的存储库中实现IDisposable吗?
谢谢
克里斯
我收到的错误是:
提交数据库事务时报告了错误,但无法确定数据库服务器上的事务是成功还是失败.有关详细信息,请参阅内部异常和http://go.microsoft.com/fwlink/?LinkId=313468.
无法执行事务操作,因为存在处理此事务的待处理请求.
我正在尝试使用MapStoredProcedure方法使用Entity Frameowrk将数据插入数据库.
我的代码:
this.MapToStoredProcedures(e => e.Insert(v => v.HasName("uspInsertUser").Result(rs => rs.UserId, "UserId")));
public ActionResult Add(User userDetails)
{
try
{
_unitOfWorkAsync.BeginTransaction();
_userService.Insert(userDetails);
_unitOfWorkAsync.SaveChangesAsync();
_unitOfWorkAsync.Commit(); // This line gives error
ModelState.Clear();
return View("Add");
}
catch (Exception ex)
{
_unitOfWorkAsync.Rollback();
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
最奇怪的是,如果我保留断点并调试代码,同时插入成功插入.
但是,当我插入没有启用任何断点时,它给我上面的错误.任何帮助表示赞赏.
我正在构建ASP.NET MVC 5应用程序.
我读到工作库和单元(UOW)模式在这里.
这些示例使用Entity Framework,它本身添加了高级抽象.
我使用的是ADO.NET而不是EF.我想知道:
asp.net-mvc ado.net design-patterns unit-of-work repository-pattern
这是一个非常具体的问题.不太确定如何说出来.基本上我正在实现工作单元和存储库模式,我有一个动态对象,我转换为int,但如果我使用var它将在尝试调用方法时抛出异常.
我试图删除所有这些问题,我可以解决这个问题.出于某种原因,我只看到这两种设计模式.我得到的例外是Additional information: 'BlackMagic.ITacoRepo' does not contain a definition for 'DoStuff'
这是代码:
class BlackMagic
{
static void Main(string[] args)
{
dynamic obj = new ExpandoObject();
obj.I = 69;
UnitOfWork uow = new UnitOfWork();
int i1 = Convert.ToInt32(obj.I);
var i2 = Convert.ToInt32(obj.I);
if(i1.Equals(i2))
{
uow.TacoRepo.DoStuff(i1); // Works fine
uow.TacoRepo.DoStuff(i2); // Throws Exception
}
}
}
class UnitOfWork
{
public ITacoRepo TacoRepo { get; set; }
public UnitOfWork()
{
TacoRepo = new TacoRepo();
}
}
class Repo<T> : IRepo<T> …Run Code Online (Sandbox Code Playgroud) c# unit-of-work repository-pattern expandoobject dynamicobject
我正在使用 UnitOfWork 模式来抽象我的 Asp.Net 应用程序中的数据库访问。基本上我遵循此处描述的 UnitOfWork 模式方法:
https://chsakell.com/2015/02/15/asp-net-mvc-solution-architecture-best-practices/
但是,我很难理解,我将如何获得新添加项目的 ID。就像我想向我的客户存储库添加新客户一样,我将如何获得客户 ID?问题是Add和Commit是解耦的,直到Commit之后才知道Id。
有没有办法使用 UnitOfWork 模式获取添加项的 id?
unit-of-work ×10
c# ×5
asp.net-mvc ×3
repository ×2
ado.net ×1
asp.net ×1
autofac ×1
interface ×1
transactions ×1