在asp.net Identity 2.0分离的上下文中引用

时间:2014-05-31 18:53:19

标签: asp.net entity-framework asp.net-web-api asp.net-identity n-tier-architecture

我尝试将我的一个API项目分成三个不同的层。

  • API
  • 数据访问(repos + uow)
  • 数据实体
  • API正在使用Asp.net Identity 2.0和我安装的示例中的代码,足以使用OAuth授权。

    然而,当我进行这种分离时,有时我会收到一个错误,告诉我需要从第一层引用第三层(实体)。我无法弄清楚原因。这会破坏分离的整个目的,对吗?

    例如,当我尝试替换此行时(来自Startup.Auth.cs中的API层,ConfigureAuth方法)

    app.CreatePerOwinContext(ApplicationDbContext.Create);
    

    使用

    app.CreatePerOwinContext(uow.CreateDbContext()) 
    

    返回ApplicationDbContext的新实例的方法。

    我希望从我的第二层返回上下文,其中我的UnitOfWork(从数据层获取ApplicationDbContext)。

    有人可以解释一下这是如何运作的吗?

    1 个答案:

    答案 0 :(得分:0)

    要解决您的问题,您需要开始使用Interfaces和任何DI框架。如果您想开始使用AutoFac(https://code.google.com/p/autofac/wiki/WebApiIntegration),我可以在这里为您提供代码。

    当您通过Nuget将AutoFac安装到您的解决方案时。在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;
    }
    

    在BLL层中创建这部分代码:

    public static class AutoFacConfiguration
    {
        public static IContainer Setup(this ContainerBuilder builder)
        {
            REGISTER ALL YOUR SERVICES AND UOW HERE
    
            return builder.Build();
        }
    }
    

    在此之后,您可以将每个服务接口注入您的ApiControllers,而WebAPi只会引用您的BLL层或您放置所有接口的层。