流暢な nhibernate を使用した優れた/シンプルな asp.net mvc アプリケーションはどこにありますか? なにか提案を..
6863 次
2 に答える
16
他のオープン ソース フレームワークの中でもFluentNHibernateを使用するASP.NET MVC アプリケーションのサンプルを作成しました。ソースコードはgithubで入手できます。
コメント セクションで要求されたように、ASP.NET MVC で FluentNhibernate を設定する際の重要な部分を要約しようとしました。
モデルを定義することから始めます。
public class User
{
public virtual int Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual int? Age { get; set; }
}
次に、モデルにアクセスできるようにするリポジトリ:
using System.Collections.Generic;
public interface IUsersRepository
{
IEnumerable<User> GetUsers();
User Get(int id);
void Delete(int id);
int Save(User user);
void Update(User user);
}
次に、このリポジトリを実装します。
using System.Collections.Generic;
using Spring.Data.NHibernate.Generic.Support;
public class SqlUsersRepository : HibernateDaoSupport, IUsersRepository
{
public IEnumerable<User> GetUsers()
{
return HibernateTemplate.LoadAll<User>();
}
public User Get(int id)
{
return HibernateTemplate.Get<User>(id);
}
public void Delete(int id)
{
HibernateTemplate.Delete(new User { Id = id });
}
public int Save(User user)
{
return (int)HibernateTemplate.Save(user);
}
public void Update(User user)
{
HibernateTemplate.Update(user);
}
}
これまでのところ、FluentNHibernate 固有のパーツはありません。では、マッピングを定義しましょう:
using FluentNHibernate.Mapping;
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("users");
Id(x => x.Id, "usr_id");
Map(x => x.FirstName, "usr_firstname");
Map(x => x.LastName, "usr_lastname");
Map(x => x.Age, "usr_age");
}
}
そして、SQLite を使用する Spring.NET セッション ファクトリですが、必要に応じて調整できます。
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.ByteCode.Castle;
using NHibernate.Cfg;
using Spring.Data.NHibernate;
public class FluentSessionFactory : LocalSessionFactoryObject
{
private readonly string _dataFile;
public FluentSessionFactory(string dataFile)
{
_dataFile = dataFile;
}
protected override ISessionFactory NewSessionFactory(Configuration config)
{
return Fluently
.Configure()
.Database(
SQLiteConfiguration
.Standard
.UsingFile(_dataFile)
.ProxyFactoryFactory<ProxyFactoryFactory>()
).Mappings(
m => m.FluentMappings.AddFromAssemblyOf<UserMap>()
).BuildSessionFactory();
}
}
次に、コントローラーを定義します。
public class HomeController : Controller
{
private readonly IUsersRepository _repository;
public HomeController(IUsersRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
return View(_repository.GetUsers());
}
}
これらすべてが整ったら、ピースを一緒に配管する必要があります。Spring.NET を使用しているため、カスタム コントローラー ファクトリを提供する必要があります。
public class SpringControllerFactory : DefaultControllerFactory
{
private static readonly IApplicationContext _springContext = ContextRegistry.GetContext();
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType != null)
{
var objectsOfType = _springContext.GetObjectsOfType(controllerType);
if (objectsOfType.Count > 0)
{
return (IController)objectsOfType.Cast<DictionaryEntry>().First<DictionaryEntry>().Value;
}
}
return base.GetControllerInstance(requestContext, controllerType);
}
}
次は web.config です。
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="~/Config/springContext.xml"/>
</context>
</spring>
<system.web>
<compilation debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>
<pages>
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
そして最後に springContext.xml:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object
id="siteRoot"
type="System.Web.Hosting.HostingEnvironment, System.Web"
factory-method="get_ApplicationPhysicalPath" />
<object
id="dataFile"
type="System.IO.Path, mscorlib"
factory-method="Combine">
<constructor-arg name="path1" ref="siteRoot" />
<constructor-arg name="path2" value="App_Data\data.db3" />
</object>
<object id="sessionFactory" type="AppName.Business.Repositories.FluentSessionFactory, AppName">
<constructor-arg name="dataFile" ref="dataFile" />
</object>
<object id="sqlUsersRepository"
type="AppName.Business.Repositories.SqlUsersRepository, AppName"
singleton="false">
<property name="SessionFactory" ref="sessionFactory"/>
</object>
<object id="home"
type="AppName.Controllers.HomeController, AppName"
singleton="false">
<constructor-arg name="repository" ref="sqlUsersRepository" />
</object>
</objects>
于 2010-06-19T19:26:17.027 に答える
4
オーチャードcmsプロジェクトは、流暢なnhibernateを使用します。
于 2010-06-17T10:53:44.633 に答える