Schloss Windsor IoC in einer MVC-Anwendung

Bereiten Sie für eine Wand-code... Es ist eine lange Lesen, aber es ist so ausführlich wie ich kann.

In Reaktion auf Immer noch verloren auf Repositories und Entkopplung ASP.NET MVC

Ich denke ich mich ab, um näher zu verstehen das alle.
Ich versuche mit diesem. Hier ist was ich habe, so weit.

Projekt

Projekt.Web - (ASP.NET MVC 3.0 RC)

  • Projekt Verwendet.Modelle
  • Projekt Verwendet.Persistenz

Projekt

Projekt.Modelle (Domain Objects)

  • Membership.Member
  • Membership.IMembershipProvider

Projekt

Projekt.Persistenz (Fluent nHibernate)

  • Projekt Verwendet.Modelle
  • Verwendet Burg.Kern
  • Verwendet Burg.Windsor

  • Membership.MembershipProvider : IMembershipProvider

Habe ich die folgende Klasse in 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
            );
        }
    }
}

Nun, in Project.Web Global.asax Application_Start, ich habe den folgenden code.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        //Register the Windsor Container
        Project.Persistence.IoC.Initialize();
    }

Nun dann, in Project.Web.Controllers.MembershipController ich habe den folgenden code.

    [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);
    }

Also Frage ich erstmal..

Bin ich auf dem richtigen Weg?

Wie kann ich ein Schloss.Windsor für meine ISessionFactory

Habe ich meine SessionFactory arbeiten wie diese ...

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();
        }

Also im Grunde, in meinem Project.Persistence Ebene, nenne ich die SessionFactory wie diese..

var session = SessionFactoryContainer.Instance.OpenSession()

Bin ich auch immer in der Nähe zu tun, dieses Recht? Ich bin immer noch verwirrt - ich fühle mich wie der ISessionFactory sollte Teil Castle.Windsor, aber ich kann nicht scheinen, um herauszufinden, wie das zu tun. Ich bin verwirrt darüber, wie ich am erstellen Repository in den Controller. Bedeutet das, dass ich zu tun haben alle die 'mapping' jedes mal, wenn ich das Repository? Das scheint, wie es wäre sehr ressourcenintensiv.

InformationsquelleAutor Ciel | 2010-12-09
Schreibe einen Kommentar