Asp.net web api WebApi 2-无法使用structuremap确定DataProtection.IDataProtector依赖项注入
我正在使用project作为MVC项目的基础。 但当我在项目中使用WebAPI时,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
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,我刚刚在回答中添加了这两个注册。