您的位置:首页 > 编程语言 > ASP

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

2013-06-03 16:32 1011 查看
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);
}   
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐