MVC3 +忍者+实体框架4

发布于 2024-10-19 04:59:45 字数 3563 浏览 1 评论 0原文

有这个依赖关系解析器

public class NinjectDependencyResolvercs : IDependencyResolver
    {
        private readonly IResolutionRoot resolutionRoot;
        public NinjectDependencyResolvercs(IResolutionRoot kernel)
        {
            resolutionRoot = kernel;
        }

        public object GetService(Type serviceType)
        {
            return resolutionRoot.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return resolutionRoot.GetAll(serviceType);
        }
    }

我在 global.asax.cs 中

// Ninject DI container ----------------------------------------------------------- |
        public void SetupDependencyInjection()
        {
            // Create Ninject DI kernel
            IKernel kernel = new StandardKernel();

            #region Register services with Ninject DI Container

            // DbContext to SqlDataContext
            kernel.Bind<DbContext>()
                    .To<SqlDataContext>();

            // IRepository to SqlRepository
            kernel.Bind<IRepository>()
                    .To<SqlRepository>();

            // IUsersServices to UsersServices
            kernel.Bind<IUsersServices>()
                    .To<UsersServices>();

            // IMessagesServices to MessagesServices
            kernel.Bind<IMessagesServices>()
                    .To<MessagesServices>();

            // IJobAdvertsServices to JobAdvertsServices
            kernel.Bind<IJobAdvertsServices>()
                    .To<JobAdvertsServices>();

            #endregion

            // Tell ASP.NET MVC 3 to use Ninject DI Container
            DependencyResolver.SetResolver(new NinjectDependencyResolvercs(kernel));
        }
        // --------------------------------------------------------------------------------- |

,并且

public class SqlDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Profile> Profiles { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<JobAdvert> JobAdverts { get; set; }
        public DbSet<Message> Messages { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasMany(x => x.Roles).WithMany(x => x.Users).Map(x =>
            {
                x.MapLeftKey(y => y.UserId, "UserId");
                x.MapRightKey(y => y.RoleId, "RoleId");
                x.ToTable("UsersInRoles");
            });

            base.OnModelCreating(modelBuilder);
        }
    }

所有依赖关系类都工作正常,但对于 DbContext 到 SqlDataContext 来说是问题。如果使用这个:

public class SqlRepository
{
    private DbContext dataContext;
    public SqlRepository(DbContext dataContext) {
        this.dataContext = dataContext;
    }

    public DbSet<User> Users {
        get {
            return dataContext.Users;
        }
    }
}

那么

dataContext.Users

和所有其他属性都会警告此错误:

'System.Data.Entity.DbContext' does not contain a definition for 'JobAdverts' and no extension method 'JobAdverts' accepting a first argument of type 'System.Data.Entity.DbContext' could be found (are you missing a using directive or an assembly reference?)   

有谁知道为什么 DI 不适用于 DbContext 类?

i have this Dependency resolver

public class NinjectDependencyResolvercs : IDependencyResolver
    {
        private readonly IResolutionRoot resolutionRoot;
        public NinjectDependencyResolvercs(IResolutionRoot kernel)
        {
            resolutionRoot = kernel;
        }

        public object GetService(Type serviceType)
        {
            return resolutionRoot.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return resolutionRoot.GetAll(serviceType);
        }
    }

in global.asax.cs

// Ninject DI container ----------------------------------------------------------- |
        public void SetupDependencyInjection()
        {
            // Create Ninject DI kernel
            IKernel kernel = new StandardKernel();

            #region Register services with Ninject DI Container

            // DbContext to SqlDataContext
            kernel.Bind<DbContext>()
                    .To<SqlDataContext>();

            // IRepository to SqlRepository
            kernel.Bind<IRepository>()
                    .To<SqlRepository>();

            // IUsersServices to UsersServices
            kernel.Bind<IUsersServices>()
                    .To<UsersServices>();

            // IMessagesServices to MessagesServices
            kernel.Bind<IMessagesServices>()
                    .To<MessagesServices>();

            // IJobAdvertsServices to JobAdvertsServices
            kernel.Bind<IJobAdvertsServices>()
                    .To<JobAdvertsServices>();

            #endregion

            // Tell ASP.NET MVC 3 to use Ninject DI Container
            DependencyResolver.SetResolver(new NinjectDependencyResolvercs(kernel));
        }
        // --------------------------------------------------------------------------------- |

and class

public class SqlDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Profile> Profiles { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<JobAdvert> JobAdverts { get; set; }
        public DbSet<Message> Messages { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasMany(x => x.Roles).WithMany(x => x.Users).Map(x =>
            {
                x.MapLeftKey(y => y.UserId, "UserId");
                x.MapRightKey(y => y.RoleId, "RoleId");
                x.ToTable("UsersInRoles");
            });

            base.OnModelCreating(modelBuilder);
        }
    }

all dependecies work fine but for DbContext to SqlDataContext is problem. If use this:

public class SqlRepository
{
    private DbContext dataContext;
    public SqlRepository(DbContext dataContext) {
        this.dataContext = dataContext;
    }

    public DbSet<User> Users {
        get {
            return dataContext.Users;
        }
    }
}

then

dataContext.Users

and all others properties alert this error:

'System.Data.Entity.DbContext' does not contain a definition for 'JobAdverts' and no extension method 'JobAdverts' accepting a first argument of type 'System.Data.Entity.DbContext' could be found (are you missing a using directive or an assembly reference?)   

Have anyone any idea why DI doent work for Class DbContext ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森罗 2024-10-26 04:59:45

如果我理解正确,您正在注入没有这些方法/属性的 DbContext,因为它们是在派生类型 SqlDataContext 中声明的。
您需要注入 SqlDataContext。如果要使用接口,则需要从 SqlDataContext 中提取接口。

编辑:

Ninject 在运行时绑定,而您收到的错误(我认为)是在编译时。您可以通过使用动态关键字来解决这个问题,但这只是解决问题。

public class SqlRepository
{
    private dynamic dataContext;
    public SqlRepository(DbContext dataContext) {
        this.dataContext = dataContext;
    }
    ...
}

您需要做的是更改签名以使用您的 SqlDataContext:

public class SqlRepository
{
 private SqlDataContextdata Context;
    public SqlRepository(SqlDataContextdata Context) {
        this.dataContext = dataContext;
    }
  ...
}

因为 DbContext 不包含这些方法,只有您的 SqlContext 包含。并且您的 sqlcontext 在运行时绑定到 DbContext。

If I understand correctly, You're injecting DbContext which doesn't have those methods/properties, as they're declared in the derived type SqlDataContext.
You need to inject the SqlDataContext. If you want to use an interface, you'll need to extract an interface from SqlDataContext.

EDIT:

Ninject binds at runtime while the errors you're getting (I presume) are at compile time. You could get around this by using the dynamic key word, but that's just working AROUND the problem.

public class SqlRepository
{
    private dynamic dataContext;
    public SqlRepository(DbContext dataContext) {
        this.dataContext = dataContext;
    }
    ...
}

What you need to do is change the signature to use your SqlDataContext:

public class SqlRepository
{
 private SqlDataContextdata Context;
    public SqlRepository(SqlDataContextdata Context) {
        this.dataContext = dataContext;
    }
  ...
}

because DbContext does not contain those methods, only your SqlContext does. and your sqlcontext is bound to DbContext at runtime.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文