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;