• Ninject 在 Winform、 Asp.net MVC中结合EntityFramework的使用( 注入同一个DbContext的使用方法) 原创


    Ninject 在 Winform、 Asp.net MVC 中结合EntityFramework的使用( 注入同一个DbContext的使用方法)

    Demo中用到了 RepositoryT.dll, RepositoryT.EntityFramework.dll,Ninject.dll,Ninject.Web.MVC.dll, Ninject.Web.Common.dll

    代码写的比较乱,也没重构 拷贝来拷贝去,作为一个合格的程序员确实有点糟糕,不过还好 能说明事情,大家将就看吧 呵呵 :)

    使用到的自定义类:

    //业务相关的类

    DataAccessRepository.cs

    IDataAccessRepository.cs

    //Ninject相关的类

    DataAccessNinjectModule.cs

    DataAccessKernelBase.cs

    DataAccessRepositories.cs

    //UnitTest 使用

    TestNinjectClass.cs

    UserTest.cs

    //Winform 使用

    Program.cs

    Form1.cs

    //ASP.NET MVC中使用:

    AccountController.cs

    /App_Start/NinjectWebCommon.cs

    具体内容:

    //业务相关的类

    IDataAccessRepository.cs

    using RepositoryT.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity.Infrastructure;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DataAccess
    {
        public interface IDataAccessRepository<TEntity> : IRepository<TEntity> where TEntity : class
        {
            DbEntityEntry GetDbEntityEntry(TEntity entity);
        }
    }

    DataAccessRepository.cs

    using RepositoryT.EntityFramework;
    using RepositoryT.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DataAccess
    {
        public class DataAccessRepository<T, TContext> : RepositoryBase<TContext>, IDataAccessRepository<T>
            where T : class
            where TContext : class, IDbContext, IDisposable
        {
    
            private readonly IDbSet<T> _dbset;
            public DataAccessRepository(IDataContextFactory<TContext> databaseFactory) :
                base(databaseFactory)
            {
                _dbset = DataContext.Set<T>();
            }
    
            public virtual void Add(T entity)
            {
                _dbset.Add(entity);
            }
        

            public DbEntityEntry GetDbEntityEntry(T entity)
            {
                return DataContext.Entry(entity);
            } } }

    //Ninject相关的类

    DataAccessNinjectModule.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Ninject.Modules;
    using DataEntities;
    using Ninject.Activation;
    using Ninject;
    using RepositoryT.EntityFramework;
    using RepositoryT.Infrastructure;
    
    namespace DataAccess
    {
        public class DataAccessNinjectModule : NinjectModule
        {
            public override void Load()
            {
                var testNinjectEntities = new TestNinjectEntities();
                //Kernel.Bind<ILoginRepository>()
                //    .To<LoginRepository>();
    
                var factory = new DefaultDataContextFactory<TestNinjectEntities>();
    
                Kernel.Bind<IDataAccessRepository<Login>>()
                    .To<DataAccessRepository<Login, TestNinjectEntities>>()
                    .InSingletonScope()
                    .WithConstructorArgument("databaseFactory",
                     factory);
    
                Kernel.Bind<IUnitOfWork>()
                    .To<UnitOfWork<TestNinjectEntities>>()
                     .InSingletonScope()
                    .WithConstructorArgument("databaseFactory", 
                    factory);
    
            }
        }
    }

    DataAccessKernelBase.cs

    using Ninject;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DataAccess
    {
        public class DataAccessKernelBase
        {
            public Ninject.IKernel Kernel
            {
                get
                {
                    var kernel = new StandardKernel(new DataAccessNinjectModule());
                    return kernel;
                }
            }
        }
    }

    DataAccessRepositories.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using Ninject;
    using DataEntities;
    using DataAccess;
    using RepositoryT.Infrastructure;
    
    namespace DataAccessUnitTestProject
    {
        public class DataAccessRepositories : DataAccessKernelBase
        {
            public IDataAccessRepository<Login> DataAccessRepository
            {
                get
                {
                    return Kernel.Get<IDataAccessRepository<Login>>();
                }
            }
    
            public IUnitOfWork UnitOfWork
            {
                get
                {
                    return Kernel.Get<IUnitOfWork>();
                }
            }
    
            public TestNinjectClass TestNinjectClass //这个属性相当重要。用这个属性Ninject可以自动注入Kernel里有的类型参数
            {
                get
                {
                    return Kernel.Get<TestNinjectClass>();
                }
            }
    
           
        }
    }

    //UnitTest 使用

    TestNinjectClass.cs

    using DataAccessUnitTestProject;
    using DataEntities;
    using RepositoryT.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DataAccess
    {
        public class TestNinjectClass
        {
            IDataAccessRepository<Login> DataAccessRepository;
    
            IUnitOfWork UnitOfWork;
    
            public TestNinjectClass(IDataAccessRepository<Login> dataAccessRepository,
                IUnitOfWork unitOfWork)
            {
                DataAccessRepository = dataAccessRepository;
                UnitOfWork = unitOfWork;
            }
    
            public void TestSave()
            {
                DataAccessRepository.Add(new Login()
                   {
                       UserName = "admin123aa",
                       Password = "123aa"
                   });
    
    
                UnitOfWork.Commit();
            }
        }
    }

    UserTest.cs

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Ninject;
    using DataAccess;
    using DataEntities;
    using RepositoryT.EntityFramework;
    using RepositoryT;
    using RepositoryT.Infrastructure;
    using System.Threading.Tasks;
    
    namespace DataAccessUnitTestProject
    {
        [TestClass]
        public class UserTest
        {
    
    
            [TestMethod]
            public void TestSave()
            {
                DataAccessRepositories rs = new DataAccessRepositories();
                rs.TestNinjectClass.TestSave();
            }
        }
    }

    //Winform 使用

    Program.cs

    namespace WindowsFormsApplication
    {
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
    
                var kernel = new StandardKernel(new DataAccessNinjectModule());
    
                var form = kernel.Get<Form1>();
    
                Application.Run(form);
            }
        }
    }

    Form1 .cs

    using DataAccess;
    using DataEntities;
    using RepositoryT.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            IDataAccessRepository<Login> _DataAccessRepository;
            IUnitOfWork _UnitOfWork;
    
            public Form1(IDataAccessRepository<Login> dataAccessRepository,
                IUnitOfWork unitOfWork)
            {
                _DataAccessRepository = dataAccessRepository;
                _UnitOfWork = unitOfWork;
    
    
                if (_DataAccessRepository != null &&
                    _UnitOfWork != null)
                {
                    var b = true;
                    try
                    {
                        _DataAccessRepository.Add(new DataEntities.Login()
                        {
                            UserName = "Admin",
                            Password = "123",
                        });
    
                        _UnitOfWork.Commit();
                    }
                    catch (Exception)
                    {
                        b = false;
                    }
                }
            }
        }
    }

    //ASP.NET MVC中使用:

    AccountController.cs

        [Authorize]
        public class AccountController : Controller
        {
    
            IDataAccessRepository<Login> _LoginDataAccessRepository;
            IUnitOfWork _UnitOfWork;
    
            public AccountController(IDataAccessRepository<Login> loginDataAccessRepository, 
                IUnitOfWork unitOfWork)
            {
                _LoginDataAccessRepository = loginDataAccessRepository;
                _UnitOfWork = unitOfWork;
            }
         public ActionResult Save(LoginModel model, string returnUrl)
            {
                var b = true;
                try
                {
                    _LoginDataAccessRepository.Add(new DataEntities.Login()
                    {
                        UserName = model.UserName,
                        Password = model.Password,
                    });

                    _UnitOfWork.Commit();

                    
                }
                catch (Exception)
                {
                    b = false;
                }
               
                if (b)
                {
                    return RedirectToLocal("http://www.ideaam.com");
                }

                // If we got this far, something failed, redisplay form
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
                return View(model);
            }
    }

    /App_Start/NinjectWebCommon.cs

    [assembly: WebActivator.PreApplicationStartMethod(typeof(MvcApplication.App_Start.NinjectWebCommon), "Start")]
    [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MvcApplication.App_Start.NinjectWebCommon), "Stop")]
    
    namespace MvcApplication.App_Start
    {
        using System;
        using System.Web;
    
        using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    
        using Ninject;
        using Ninject.Web.Common;
        using Service;
        using RepositoryT.EntityFramework;
        using DataAccess;
        using DataEntities;
        using RepositoryT.Infrastructure;
    
        public static class NinjectWebCommon 
        {
            private static readonly Bootstrapper bootstrapper = new Bootstrapper();
    
            /// <summary>
            /// Starts the application
            /// </summary>
            public static void Start() 
            {
                DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
                DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
                bootstrapper.Initialize(CreateKernel);
            }
            
            /// <summary>
            /// Stops the application.
            /// </summary>
            public static void Stop()
            {
                bootstrapper.ShutDown();
            }
            
            /// <summary>
            /// Creates the kernel that will manage your application.
            /// </summary>
            /// <returns>The created kernel.</returns>
            private static IKernel CreateKernel()
            {
                var kernel = new StandardKernel();
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
                
                RegisterServices(kernel);
                return kernel;
            }
    
            /// <summary>
            /// Load your modules or register your services here!
            /// </summary>
            /// <param name="kernel">The kernel.</param>
            private static void RegisterServices(IKernel kernel)
            {
                var factory = new DefaultDataContextFactory<TestNinjectEntities>();
    
                kernel.Bind<IDataAccessRepository<Login>>()
                    .To<DataAccessRepository<Login, TestNinjectEntities>>()
                    .InRequestScope()
                    .WithConstructorArgument("databaseFactory",
                     factory);
    
                kernel.Bind<IUnitOfWork>()
                    .To<UnitOfWork<TestNinjectEntities>>()
                    .InRequestScope()
                    .WithConstructorArgument("databaseFactory", factory);
            }        
        }
    }
  • 相关阅读:
    ZOJ2833*(并查集)
    大学(转载)
    Poj1503
    ibatis中select password('string')引起的bug
    servlet直接调用spring的serivce方法
    如何Eclipse自动提示
    servlet直接调用spring的serivce方法
    ibatis中select password('string')引起的bug
    如何Eclipse自动提示
    如何Eclipse自动提示
  • 原文地址:https://www.cnblogs.com/haoliansheng/p/3115679.html
Copyright © 2020-2023  润新知