C# 将DbContextScopeFactory与Unity一起使用
我正试图使用这个工具,却遇到了一个问题C# 将DbContextScopeFactory与Unity一起使用,c#,asp.net-mvc,entity-framework,unity-container,C#,Asp.net Mvc,Entity Framework,Unity Container,我正试图使用这个工具,却遇到了一个问题 public class VendorRepository : IVendorRepository { private readonly IDbContextScopeFactory _dbContextScopeFactory; public VendorRepository(IDbContextScopeFactory dbContextScopeFactory) { if (dbContextScopeFac
public class VendorRepository : IVendorRepository
{
private readonly IDbContextScopeFactory _dbContextScopeFactory;
public VendorRepository(IDbContextScopeFactory dbContextScopeFactory)
{
if (dbContextScopeFactory == null)
{
throw new ArgumentNullException("dbContextScopeFactory");
}
_dbContextScopeFactory = dbContextScopeFactory;
}
public IList<MyVendor> GetMyVendors(int requestorId)
{
IList<MyVendor> vndrsList = null;
using (var dbContextScope = _dbContextScopeFactory.CreateReadOnly())
{
var dbContext = dbContextScope.DbContexts.Get<VendorMgmtContext>();
var vndrs = (from a in dbContext.sp_GetVendorByRequestor(requestorId)
select new MyVendor
{
VendorId = a.VendorId,
VendorName = a.VendorName,
CreatedByUserId = a.CreatedByUserId,
CreatedDate = a.CreatedDate
});
vndrsList = vndrs.ToList();
}
return vndrsList;
}
到
我的webAPI终于开始工作了。然而,在MVC方面,我仍然得到同样的例外
[MissingMethodException:没有为此对象定义无参数构造函数。]
System.RuntimeTypeHandle.CreateInstance(RuntimeType类型、Boolean publicOnly、Boolean noCheck、Boolean&canBeCached、RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔skipCheckThis、布尔fillCache、StackScrawlMark和stackMark)+119
System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly、布尔skipCheckThis、布尔fillCache、StackScrawlMark和stackMark)+232
System.Activator.CreateInstance(类型,布尔非公共)+83
System.Activator.CreateInstance(类型)+11
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext-RequestContext,类型controllerType)+110
[InvalidOperationException:尝试创建“Portal.controller.VendorController”类型的控制器时出错。请确保该控制器具有无参数公共构造函数。]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext-RequestContext,Type controllerType)+247
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext-RequestContext,类型controllerType)+437
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext RequestContext,String controllerName)+257
ProcessRequestInit(HttpContextBase httpContext、IController和controller、IControllerFactory和factory)+326
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,异步回调,对象状态)+157
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext HttpContext,异步回调,对象状态)+88
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.BeginProcessRequest(HttpContext上下文,AsyncCallback cb,Object extraData)+50
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+103
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+155
我有一个构造函数
public class VendorController : Controller
{
IVendorService _VendorService;
public VendorController(IVendorService VendorSvc)
{
_VendorService = VendorSvc;
}
// GET: Vendor
public ActionResult Index()
{
return View();
}
}
错误消息清楚地说明了问题所在。您尚未正确设置
IControllerFactory
或IDependencyResolver
以使用Unity解析实例。这与你的注册无关
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
或
请注意,您可以自己构建其中的一个,也可以从某处使用stock实现。但是还要注意。根据您发布的堆栈跟踪,看起来您试图调用的是Web API控制器,而不是ASP.NET Mvc控制器(如问题标签所示)。此外,该错误不是在注册期间发生的,而是在控制器实例化期间发生的 Web API尝试使用您没有的默认构造函数实例化控制器(因为您预期将依赖项注入构造函数)。您需要将Unity设置为依赖项解析程序,以连接控制器依赖项。您可以从NuGet添加。这将为您注册UnityDependencyResolver(在UnityWebPiActivator.cs中): 您还可以将所有注册码移动到UnityConfig.cs中
我看到您正在使用PyReleFiFiTimeMaMaGER——您可能需要考虑使用PrimeStestPurimeMaMaGER安装。PerRequestLifetimeManager将在web请求结束时自动处理IDisposable对象。
DbContextScopeFactory构造函数采用IDbContextFactory类型的可选参数。如果我将注册代码更改为使用InjectionFactory,那么它将在我的简单测试中工作:container.RegisterType(new InjectionFactory((a)=>new DbContextScopeFactory())代码>使用InjectionFactory时会出现什么异常?您是否有正在使用的IDbContextFactory实现?添加了异常errorthx nightowl。根据Randy的建议更新了unity引导程序,该更新自动添加了UnityDependencySolverthanks Randy。我太接近了。我终于能够让WebAPI工作了。谢谢你。但是ASP.NETMVC仍然给我那个愚蠢的错误。此外,我试图从PerreSolveLifeTime Manager更改为PerreRequestLifeTime Manager,但找不到PerreRequestLifeTime Manager。Randy,我重新阅读了你的建议。我错过了一步。我安装了,它的工作!谢谢谢谢谢谢!!
container.RegisterType<IAmbientDbContextLocator, AmbientDbContextLocator>();
container.RegisterType<IDbContextScopeFactory, DbContextScopeFactory>(new InjectionFactory((a) => new DbContextScopeFactory()));
container.RegisterType<IDbContextScopeFactory, DbContextScopeFactory>(new InjectionFactory((a) => new DbContextScopeFactory()));
Message: "An error occurred when trying to create a controller of type 'VendorController'. Make sure that the controller has a parameterless public constructor"
ExceptionType: System.InvalidOperationException
StackTrace:
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
InnerException:
Message: "Type 'Portal.Controllers.Api.VendorController' does not have a default constructor"
ExceptionType: System.ArgumentException
StackTrace:
at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
UnityConfig.RegisterComponents();
UnityWebApiActivator.Start();
public class VendorController : Controller
{
IVendorService _VendorService;
public VendorController(IVendorService VendorSvc)
{
_VendorService = VendorSvc;
}
// GET: Vendor
public ActionResult Index()
{
return View();
}
}
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
var resolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(UnityConfig.GetConfiguredContainer());
GlobalConfiguration.Configuration.DependencyResolver = resolver;