好的/简单的asp.net mvc应用程序,流利的nhibernate

ACP*_*ACP 2 c# asp.net-mvc sample fluent-nhibernate

哪里可以找到一个流利的nhibernate好/简单的asp.net mvc应用程序?任何建议..

Dar*_*rov 16

我编写了一个示例ASP.NET MVC应用程序,它在其他开源框架中使用FluentNHibernate.该源代码可以在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; }
}
Run Code Online (Sandbox Code Playgroud)

然后是允许您访问模型的存储库:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后实现此存储库:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止还没有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");
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

接着我们定义一个控制器:

public class HomeController : Controller
{
    private readonly IUsersRepository _repository;
    public HomeController(IUsersRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        return View(_repository.GetUsers());
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我们完成所有这些工作,我们需要将各个部分连接在一起.当我们使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来是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>
Run Code Online (Sandbox Code Playgroud)

最后是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>
Run Code Online (Sandbox Code Playgroud)