Подготовьтесь к стене кода... Это долго читается, но это так много подробностей, как я могу получить.
В ответ на Все еще потеряно в репозиториях и развязке, ASP.NET MVC
Я думаю. Я начинаю все ближе понимать все. Я пытаюсь привыкнуть к этому. Вот что я до сих пор.
Проект
Project.Web(ASP.NET MVC 3.0 RC)
- Использует Project.Models
- Использование Project.Persistence
Проект
Project.Models(Объекты домена)
-
Membership.Member
-
Membership.IMembershipProvider
Проект
Project.Persistence(Свободный nHibernate)
- Использует Project.Models
- Использование Castle.Core
-
Использование Castle.Windsor
-
Membership.MembershipProvider : IMembershipProvider
У меня есть следующий класс в Project.Persistence
using Castle.Windsor;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
namespace Project.Persistence
{
public static class IoC
{
private static IWindsorContainer _container;
public static void Initialize()
{
_container = new WindsorContainer()
.Install(
new Persistence.Containers.Installers.RepositoryInstaller()
);
}
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
}
}
namespace Persistence.Containers.Installers
{
public class RepositoryInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<Membership.IMembershipProvider>()
.ImplementedBy<Membership.MembershipProvider>()
.LifeStyle.Singleton
);
}
}
}
Теперь, в Project.Web
Global.asax
Application_Start
, у меня есть следующий код.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Register the Windsor Container
Project.Persistence.IoC.Initialize();
}
Теперь, в Project.Web.Controllers.MembershipController
, у меня есть следующий код.
[HttpPost]
public ActionResult Register( Web.Models.Authentication.Registration model)
{
if (ModelState.IsValid)
{
var provider = IoC.Resolve<Membership.IMembershipProvider>();
provider.CreateUser(model.Email, model.Password);
}
// If we got this far, something failed, redisplay form
return View(model);
}
Итак, я спрашиваю в первую очередь..
Я на правильном пути?
Как я могу использовать Castle.Windsor для моего ISessionFactory
У меня работает SessionFactory...
namespace Project.Persistence.Factories
{
public sealed class SessionFactoryContainer
{
private static readonly ISessionFactory _instance = CreateSessionFactory();
static SessionFactoryContainer()
{
}
public static ISessionFactory Instance
{
get { return _instance; }
}
private static ISessionFactory CreateSessionFactory()
{
return Persistence.SessionFactory.Map(@"Data Source=.\SQLEXPRESS;Initial Catalog=FluentExample;Integrated Security=true", true);
}
}
}
namespace Project.Persistence
{
public static class SessionFactory
{
public static ISessionFactory Map(string connectionString, bool createSchema)
{
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.Is(connectionString)))
.ExposeConfiguration(config =>
{
new NHibernate.Tool.hbm2ddl.SchemaExport(config)
.SetOutputFile("Output.sql")
.Create(/* Output to console */ false, /* Execute script against database */ createSchema);
})
.Mappings(m =>
{
m.FluentMappings.Conventions.Setup(x =>
{
x.AddFromAssemblyOf<Program>();
x.Add(FluentNHibernate.Conventions.Helpers.AutoImport.Never());
});
m.FluentMappings.AddFromAssemblyOf<Mapping.MembershipMap>();
}).BuildSessionFactory();
}
Итак, в основном, на моем уровне Project.Persistence
я вызываю SessionFactory следующим образом.
var session = SessionFactoryContainer.Instance.OpenSession()
Неужели я даже приблизился к этому? Я все еще смущен - мне кажется, что ISessionFactory
должен быть частью Castle.Windsor
, но я не могу понять, как это сделать. Я также смущен тем, как создаю репозиторий в контроллере. Означает ли это, что я должен выполнять все "сопоставление" каждый раз, когда я использую репозиторий? Кажется, это было бы очень ресурсоемким.