在VS2017中获取有效的IServiceProvider实例

时间:2017-06-25 17:49:25

标签: c# asp.net visual-studio-2017

我在VS 2017社区中使用ASP.NET MVC和C#创建概念验证来创建种子数据。

这是我的基本抽象类:

public abstract class SeedBase
    {
        protected ApplicationDbContext appDBContext { get; set; }
        public SeedBase()
        {

        }

        public SeedBase(IServiceProvider serviceProvider)
        {
            appDBContext = serviceProvider.GetService<ApplicationDbContext>();
        }
        public abstract void Seed();
    }

然后我还创建了一个允许用户播种的身份抽象:

public abstract class IdentitySeeding : SeedBase
    {
        protected RoleStore<IdentityRole> roleStore { get; set; }
        public IdentitySeeding(IServiceProvider serviceProvider ) : base(serviceProvider)
        {
            roleStore = new RoleStore<IdentityRole>( appDBContext );
        }

        protected abstract string[] GetRoleNames();

        public void SeedRoles()
        {
            string[] roles = GetRoleNames();
            foreach( string Role in roles)
            {
                if (!appDBContext.Roles.Any<IdentityRole>( r => r.Name == Role ))
                {
                    roleStore.CreateAsync(new IdentityRole(Role));
                }
            }
        }

        public override void Seed()
        {
            SeedRoles();
        }
    }

最后,我创建了一个seeder类,它接受一个种子类数组并创建实际的种子:

public class Seeder
    {
        public Seeder()
        {

        }

        public Seeder(SeedBase[] SeedClasses)
        {

        }
    }

但是,您可能会说,我找不到任何方法来获取IServiceProvider实例。我已经google了一下,在Stack Overflow上遇到了IAppBuilder接口,但深度谷歌搜索并没有发现任何好的线索。然后我扩展了我的搜索,发现了一个神秘的“IServiceCollection” - 理论上 - 它应该在Microsoft Dependency Injection扩展中。我相当肯定我已经通过NuGet正确安装了它,因为它给了我在种子类中使用的IServiceProvider的通用版本。 对我来说很明显我错过了一些东西,但我不确定是什么。 领导赞赏。

0 个答案:

没有答案