私はリポジトリパターンを使用しようとしています。流暢なnhibernateを持つDI用のninjectです。流暢なnhibernateでリポジトリを設定するにはどうすればよいですか?
私は、だから私はセットアップこれまでを持っている3つのプロジェクト
web ui - controllers,view (I am using asp.net mvc 2.0)
framework - repository, domain, fluent mapping
tests - where my unit tests will go.
に私の解決策を解体します。
Global.aspx
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
だから私はninjectコントローラの工場の使用を開始する自分のアプリケーションに置きます。
NinjectControllerFactoryここに私のセットアップ私のninjectもの
public class NinjectControllerFactory : DefaultControllerFactory
{
// A Ninject "kernel" is the thing that can supply object instances
private IKernel kernel = new StandardKernel(new T4GDemoSevice());
// ASP.NET MVC calls this to get the controller for each request
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null)
return null;
return (IController)kernel.Get(controllerType);
}
// Configures how abstract service types are mapped to concrete implementations
private class DemoSevice : NinjectModule
{
public override void Load()
{
Bind<ISessionFactory>().ToMethod(c => GetSessionFactory()).InSingletonScope();
Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();
Bind<IUsers>().To<UsersRepo>().WithConstructorArgument("session",GetSessionFactory());
}
public static ISessionFactory GetSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("test")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<T4G_Demo.Framework.Data.NhibernateMapping.UserMap>())
.BuildSessionFactory();
}
}
}
。私は流暢を設定する方法を作った。私は理解しているので、これはWebリクエストごとに1回しか発生しません(これはアプリケーション起動時に呼び出されるためだと思います)。
私のGetSessionFactoryメソッドを静的にする必要があるかどうかはわかりません。
次に、私のIUsersインターフェイスを自分のUserRepoにバインドし、コンストラクタ引数を渡します。私は、私のReposが何かをするためにnhibernateのセッションを必要としていると推測しています。だから私はそれを私のレポにどのように渡すのか分からなかった。
私はそれぞれのリポジトリが構成になると間違っているかもしれないと思いますか?
リポジトリ
public class UsersRepo : IUsers
{
private ISessionFactory session;
public UsersRepo(ISessionFactory session)
{
this.session = session;
}
public void CreateUser(Domain.Users newUser)
{
var openSession = session.OpenSession();
var transaction = openSession.BeginTransaction();
openSession.SaveOrUpdate(newUser);
transaction.Commit();
}
}
私はリポジトリを作ってみましたが、再び私はセッションでそれを行う方法がわからないです。私はそれを開いて取引を始めなければならないのです。それが他のどこかで行われるべきかどうかはわかりません。
また、メソッドを実行した後に処理する必要があるかどうかもわかりませんでした。私は人々がapplication_end()メソッドを処理しているのを見ました。
マイホームコントローラー
private IUsers usersRepository;
public HomeController(IUsers usersRepository)
{
this.usersRepository = usersRepository;
}
public ActionResult Index()
{
Users test = new Users()
{
OpenIdIdentifier = "123",
Email = "[email protected]",
};
usersRepository.CreateUser(test);
return View();
}
は、最後に私はダミーのユーザーを作成し、DBに挿入するダミーのコントローラを作りました。それは動作しますが、私はセッションの部分が私に混乱させると言ったように、どうやってそれを渡すのか分かりません。
編集
これは私がこれまでに出ているものです。それはまだ私が望むものではない(私はむしろリクエストごとにセッションを持っている)が、動作しているようだ。
Ninject工場
public static ISessionFactory GetSessionFactory()
{
if (session == null)
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("test")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<T4G_Demo.Framework.Data.NhibernateMapping.UserMap>())
//.ExposeConfiguration(BuidSchema)
.BuildSessionFactory();
}
return session;
}
声明場合、私は、セッションが開始されているかどうかチェックするためにAを追加しました。だから、これは毎回SessionFactoryを起動する問題を処理するはずです。
私のレポは、だから私はない、私はこの方法で1を開いた場合、セッションが開いているかどうかを確認それぞれの方法でこの
public class UsersRepo : IUsers
{
private ISession openSession;
private ISessionFactory session;
public UsersRepo(ISessionFactory session)
{
this.openSession = session.OpenSession();
this.session = session;
}
public void CreateUser(Users newUser)
{
openSession = NhibernateUtilities.OpenIfClosed(session, openSession);
openSession.SaveOrUpdate(newUser);
}
public Users GetUser(Guid userId)
{
openSession = NhibernateUtilities.OpenIfClosed(session, openSession);
var query = from b in openSession.Query<Users>()
where b.UserId == userId
select b;
return query.SingleOrDefault();
}
public void DeleteUser(Users user)
{
openSession = NhibernateUtilities.OpenIfClosed(session, openSession);
openSession.Delete(user);
}
public void SaveOrUpdate()
{
using (openSession)
{
using (var transaction = openSession.BeginTransaction())
{
transaction.Commit();
}
}
}
のように見えます。
public static ISession OpenIfClosed(ISessionFactory session, ISession openSession)
{
if (openSession.IsOpen == false)
{
return session.OpenSession();
}
return openSession;
}
私はこの方法を取り除きたいと言っていましたが、私はセッションをreposに渡す方法がわかりません。誰かが私にそれを見せるまで、私は今のようにそれをしなければならないと思います。
ええと、最初はIkernalがコントローラにない。私はpro asp.net mvc 2.0の作者がどこに置いたかを追っていた。私はSessionFactoryが作成するのに高価であることを認識しています。私はそれをapplication_startに入れることを私が考えていたのは、一度だけ作成する必要があったからです。私も混乱していますが、このコードがすべてあなたのwebuiプロジェクトにこれから行くのですか?非常に簡単なプロジェクトを見ることができるので、私はデバッガでそれを歩くことができますか?例えば、私はリポジトリがコンストラクタ内でそのセッションを要求している場所や場所を見ていません。 – chobo2