Intergratin Autofac到ASP.NET WEPAPI

时间:2015-10-30 09:32:55

标签: asp.net-web-api entity-framework-6 owin autofac unit-of-work

+我创建了UnitOfWork,实体框架DbContext初始化为private DbContext context = new DbContext();所有工作都很好,直到我想更新数据库中的字段。更改将反映在数据库中,但 DbContext 不会反映更改。但是,向数据库添加新记录的更改反映在DbContext中,但不是修改。我必须重新启动应用程序才能看到更改。因此,类似于修改后不会丢弃DbContext。 所以我决定使用 Autofac 来创建单个数据库实例。这是我的背景:

public class DatabaseContext : IdentityDbContext<ApplicationUser>
    {
        static DatabaseContext()
        {
            Database.SetInitializer(new MySqlInitializer());
        }


        public DatabaseContext() : base("apiConnection") { }

        public DbSet<PaperEntity> PastPapers { get; set; }
}

我注册了这样的上下文,

var builder = new ContainerBuilder();
            builder.RegisterType<DatabaseContext>().AsSelf().SingleInstance();
            //builder.RegisterType<UnitOfWork>().SingleInstance();


            builder.RegisterApiControllers(typeof(AccountController).Assembly);
            //builder.RegisterType<ISecureDataFormat<AuthenticationTicket>>().As<TicketDataFormat>();
            //builder.RegisterApiControllers(Assembly.GetExecutingAssembly());


            builder.RegisterType<SimpleAuthorizationServerProvider>()
                .AsImplementedInterfaces<IOAuthAuthorizationServerProvider, ConcreteReflectionActivatorData>().SingleInstance();

            container = builder.Build();

            app.UseAutofacMiddleware(container);

            var webApiDependencyResolver = new AutofacWebApiDependencyResolver(container);

            var configuration = new HttpConfiguration
            {
                DependencyResolver = webApiDependencyResolver
            };

            ConfigureOAuth(app, container);

            WebApiConfig.Register(configuration);

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            app.UseWebApi(configuration);

            app.UseAutofacWebApi(configuration);

我有一个看起来像这样的AccountController

[RoutePrefix("api/Account")]
    public class AccountController : ApiController
    {
        private readonly AccountService accountService;
        public AccountController()
        {
            accountService = new AccountService();
        }



        private IAuthenticationManager Authentication
        {
            get { return Request.GetOwinContext().Authentication; }
        }

        [AllowAnonymous]
        [HttpPost]
        [Route("Register")]
        public async Task<IHttpActionResult> Register([FromBody]RegisterBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            IdentityResult result = await accountService.RegisterUser(model, this);

            return Ok(result);
        }

帐户控制器有一个

private readonly AccountService accountService;
            public AccountController()
            {
                accountService = new AccountService();
            }

具有工作单元实例的实例,如此...

private UnitOfWork unitOfWork;
        public AccountService()
        {
           unitOfWork = new UnitOfWork();
        }

现在,我确定我已经配置了Autofac,因为授权适用于此,

AuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                Provider = container.Resolve<IOAuthAuthorizationServerProvider>(),
                //AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            };

请注意Provider = container.Resolve<IOAuthAuthorizationServerProvider>()部分。但是当我尝试从UnitOfWork中的容器中获取DatabaseContext实例时, 像这样,

private static IContainer Container { get; set; }
        private DatabaseContext context = Container.BeginLifetimeScope().Resolve<DatabaseContext>();

一切都停止工作,出现以下错误

  

“消息”:“发生错误。”,“ExceptionMessage”:“错误   尝试创建类型的控制器时发生   '的AccountController'。确保控制器具有无参数   public constructor。“,”ExceptionType“:   “System.InvalidOperationException”,“StackTrace”:“at   System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage   请求,HttpControllerDescriptor controllerDescriptor,Type   controllerType)\ r \ n at   System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage   请求)\ r \ n at   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

我希望获得帮助以获取已注册的DatabaseContext而无需为上下文创建接口,或者如何创建没有接口的UnitOfWork实例,或者两者兼而有之,我不想要的只是DatabaseContext,UnitOfWork或Services中的额外接口,但最好是,如果一个界面是不可避免的,UnitOfWork将是拥有它的最佳地点......

0 个答案:

没有答案