我尝试将我的一个API项目分成三个不同的层。API
API使用Asp.net Identity 2.0和我安装的示例代码,刚好可以使用OAuth授权。
然而,当我进行这种分离时,有时会得到一个错误,告诉我需要从第一层引用第三层(实体)。我不知道为什么。那会破坏分居的目的,对吧?
例如,当我尝试替换这一行(从API层在Startup.Auth.cs, ConfigureAuth方法)
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext(uow.CreateDbContext())
返回ApplicationDbContext的新实例的方法。
我希望上下文从我的第二层返回,我的UnitOfWork所在的地方(它反过来从数据层获得ApplicationDbContext)。
有人能解释一下这是怎么回事吗?
要解决您的问题,您需要开始使用接口和任何di框架。如果您想开始使用AutoFac (https://code.google.com/p/autofac/wiki/WebApiIntegration),我可以在这里为您提供代码。
当您通过Nuget将autofacc安装到解决方案中时。将这部分代码添加到Global.asax.cs文件中。
protected void Application_Start()
{
...
SetupAutoFac();
...
}
private static void SetupAutoFac()
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var container = builder.Setup();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
}
在你的bl层中创建这部分代码:
public static class AutoFacConfiguration
{
public static IContainer Setup(this ContainerBuilder builder)
{
REGISTER ALL YOUR SERVICES AND UOW HERE
return builder.Build();
}
}
在此之后,你可以将每个服务接口注入到你的ApiControllers中,而WebAPi将只引用到你的bl层或你放置所有接口的层。