简体   繁体   English

在 ASP.NET Core 中的 Startup 类中访问服务

[英]Accessing service in Startup class in ASP.NET Core

I would like to update the DB after a user logged in to my app (using fb) and I am not sure how to use the DbContext within startup.cs.我想在用户登录我的应用程序(使用 fb)后更新数据库,但我不确定如何在 startup.cs 中使用DbContext

startup.cs:启动.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<mysiteContext>(options =>
    options.UseSqlServer(_configurationRoot.GetConnectionString("DefaultConnection")));

    services.AddAuthentication(options =>
        {
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
        .AddFacebook(options =>
        {
            options.AppId = "********";
            options.AppSecret = "*********";
            options.Events.OnCreatingTicket = context =>
            {
                var userFbId = context.User.Value<string>("id");
                string userProfileImageUrl = $"https://graph.facebook.com/{userFbId}/picture?type=large";

                //TODO: Save to DB infromation about the user and update last login date.   
                //This is where I am having the issue.
                UserRepository userRepo = new UserRepository();

                //Example how to add information to the claim.
                var surname = context.User.Value<string>("last_name");
                context.Identity.AddClaim(new Claim(ClaimTypes.Surname, surname));

                return Task.FromResult(0);
            };
        })
        .AddCookie();

And my UserRepository.cs:还有我的 UserRepository.cs:

public class UserRepository
{
    private readonly mysiteContext _myDbContext;
    private readonly short _languageTypeId;

    public UserRepository(mysiteContext ctx)
    {
        _myDbContext = ctx;
        _languageTypeId = Language.GetLanguageTypeId();
    }
}

How can I pass mysiteContext to the UserRepository class?如何将mysiteContext传递给UserRepository类?

You can do as follows: 您可以执行以下操作:

services.AddScoped<UserRepository>(); // <-- Register UserRepository here

services.AddAuthentication(options =>
{
        options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddFacebook(options =>
   {
         options.AppId = "********";
         options.AppSecret = "*********";
         options.Events.OnCreatingTicket = context =>
         {
               ........

               ServiceProvider serviceProvider = services.BuildServiceProvider();
               var userRepository =  serviceProvider.GetService<UserRepository>();

               // Do whatever you want to do with userRepository here.

               .........

               return Task.FromResult(0);
          };
   })

Alternatively you can also get UserRepository instance from context as follows: 另外,您还可以从context获取UserRepository实例,如下所示:

var userRepository =  context.HttpContext.RequestServices.GetService<UserRepository>();

I had to use my Dapper service inside 'ConfigureServices' section, where 'context' is not available.我必须在“ConfigureServices”部分中使用我的 Dapper 服务,其中“上下文”不可用。 The easiest way for me was to get the service via 'BuildServiceProvider':对我来说,最简单的方法是通过“BuildServiceProvider”获取服务:

IDapper _dapper = services.BuildServiceProvider().GetService<IDapper>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM