Asp.net web api WebApi 2-无法使用structuremap确定DataProtection.IDataProtector依赖项注入

Asp.net web api WebApi 2-无法使用structuremap确定DataProtection.IDataProtector依赖项注入,asp.net-web-api,dependency-injection,asp.net-mvc-5,structuremap,Asp.net Web Api,Dependency Injection,Asp.net Mvc 5,Structuremap,我正在使用project作为MVC项目的基础。 但当我在项目中使用WebAPI时,IDataProtector注入中存在问题。 我重新设计了base和upload,并添加了一个控制台项目,用于使用WebAPI进行测试授权 这是structuremap初始化: private static readonly Lazy<Container> _containerBuilder = new Lazy<Container>(initStru

我正在使用project作为MVC项目的基础。 但当我在项目中使用WebAPI时,
IDataProtector
注入中存在问题。 我重新设计了base和upload,并添加了一个控制台项目,用于使用WebAPI进行测试授权

这是structuremap初始化:

            private static readonly Lazy<Container> _containerBuilder =
        new Lazy<Container>(initStructureMap, LazyThreadSafetyMode.ExecutionAndPublication);

    public static IContainer Container
    {
        get { return _containerBuilder.Value; }
    }
return new Container(ioc =>
        {
            ioc.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use(() => new DbContext());

            ioc.For<IDataSerializer<AuthenticationTicket>>().Use<TicketSerializer>();
            ioc.For<ISecureDataFormat<AuthenticationTicket>>().Use<SecureDataFormat<AuthenticationTicket>>();

        });
在我的启动中,我使用IAppBuilder创建dataprotector:

        public void ConfigureAuth(IAppBuilder app)
    {
        StructuremapMvc.Container.Configure(config =>
        {
            config.For<IDataProtectionProvider>()
                  .HybridHttpOrThreadLocalScoped()
                  .Use(() => app.GetDataProtectionProvider());
        });
     }
public void ConfigureAuth(IAppBuilder应用程序)
{
StructuremapMvc.Container.Configure(配置=>
{
config.For()
.HybridHttpOrthReadLocalScope()文件
.Use(()=>app.GetDataProtectionProvider());
});
}

它在WebApi中WebApiConfig和IDataProtection不起作用后启动。my ServiceLayer位于单独的项目中,需要在其中注入数据保护。

您需要在容器中显式注册
IDataProtector
的实现

示例配置可能如下所示:

            var container = StructuremapMvc.Container;
        GlobalConfiguration.Configuration.Services.Replace(
            typeof(IHttpControllerActivator), new  StructureMapHttpControllerActivator(container));
ioc.For<IDataProtector>().Use(() => new DpapiDataProtectionProvider().Create("ASP.NET Identity"));
ioc.For<ITextEncoder>().Use<Base64UrlTextEncoder>();
ioc.For()。使用(()=>newdpapidataprotectionprovider()。创建(“ASP.NET标识”);
ioc.For().Use();
请记住,此特定配置可能不适合您的确切需要


希望这有帮助

您需要在项目中添加两个类:

1-StructureMappDependencyScope类

using StructureMap;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies;

namespace Project.Helpers
{
    public class StructureMapDependencyScope : IDependencyScope
    {
        protected readonly IContainer Container;

        public StructureMapDependencyScope(IContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            this.Container = container;
        }

        public void Dispose()
        {
            this.Container.Dispose();
        }

        public object GetService(Type serviceType)
        {
            if (serviceType == null)
            {
                return null;
            }

            try
            {
                return serviceType.IsAbstract || serviceType.IsInterface
                           ? this.Container.TryGetInstance(serviceType)
                           : this.Container.GetInstance(serviceType);
            }
            catch
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return this.Container.GetAllInstances(serviceType).Cast<object>();
        }
    }
}
using StructureMap;
using System.Web.Http.Dependencies;

namespace Project.Helpers
{
    public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver
    {
        public StructureMapDependencyResolver(IContainer container)
            : base(container)
        {
        }
        public IDependencyScope BeginScope()
        {
            IContainer child = this.Container.GetNestedContainer();
            return new StructureMapDependencyResolver(child);
        }
    }
}
最后,在WebApiConfig类中用您的代码替换此代码:

// IoC Config
var container = SmObjectFactory.Container;

// Web API configuration and services
config.DependencyResolver = new StructureMapDependencyResolver(container);

阅读有关ASP.NET MVC 4和Web API中依赖项注入的详细信息(按结构映射)。

请在此处显示,而不是链接到其他地方的大块代码。使用此选项时,OwinContext.GetUserManager()返回null!似乎在我的机器上userManager解决了这个问题。我唯一的问题是没有现有的用户。如果你有时间来修复模板,我将不胜感激。它有一个用于测试的控制台项目。在我的项目中,没有工作。也许你用的是不同的方式,我无法在第一篇文章中解释当前的情况。谢谢…@Princedotnet,我刚刚在回答中添加了这两个注册。