asp.net-mvc – 城堡温莎IoC在一个MVC应用程序
|
准备一个代码墙…这是一个漫长的阅读,但它是一样冗长,我可以得到. 响应Still lost on Repositories and Decoupling,ASP.NET MVC 我想我已经开始越来越了解这一切了. 项目
>使用Project.Models 项目
>会员.会员 项目
>使用Project.Models 我在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的一部分,但我似乎无法弄清楚如何做到这一点.我也对我在控制器中创建存储库的方式感到困惑.这是否意味着我每次使用存储库时都必须执行所有的“映射”?这似乎是非常耗资源的. 解决方法首先是一些概念细节.在ASP.NET MVC应用程序中,页面请求的典型入口点是控制器.我们希望控制反转控制容器为我们解决我们的控制器,因为控制器所拥有的任何依赖关系也可以通过将依赖项列为控制器构造函数中的参数来简单地自动解析.困惑了吗以下是使用IoC的一个例子.我认为这样解释使事情更容易! public class HomeController : Controller
{
// lets say your home page controller depends upon two providers
private readonly IMembershipProvider membershipProvider;
private readonly IBlogProvider blogProvider;
// constructor,with the dependencies being passed in as arguments
public HomeController(
IMembershipProvider membershipProvider,IBlogProvider blogProvider)
{
this.membershipProvider = membershipProvider;
this.blogProvider = blogProvider;
}
// so taking your Registration example...
[HttpPost]
public ActionResult Register( Web.Models.Authentication.Registration model)
{
if (ModelState.IsValid)
{
this.membershipProvider.CreateUser(model.Email,redisplay form
return View(model);
}
}
注意,你没有必要做任何解决自己,你刚刚在控制器中指定了依赖关系.实际上也没有指出依赖关系是如何实现的 – 它们都是脱钩的.这很简单,这里没有什么复杂的:-) 希望在这一点上你会问,“但是构造函数如何被实例化?这是我们开始设置您的Castle容器的地方,我们完全在MVC Web项目(不是Persistence或Domain)中完成.编辑Global.asax文件,将Castle Windsor设置为控制器工厂: protected void Application_Start()
{
//...
ControllerBuilder.Current
.SetControllerFactory(typeof(WindsorControllerFactory));
}
…并定义WindsorControllerFactory,以便您的控制器由Windsor实例化: /// Use Castle Windsor to create controllers and provide DI
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer container;
public WindsorControllerFactory()
{
container = ContainerFactory.Current();
}
protected override IController GetControllerInstance(
RequestContext requestContext,Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
ContainerFactory.Current()方法是静态单例,返回配置的Castle Windsor容器.容器的配置指示Windsor如何解决应用程序的依赖关系.因此,例如,您可能有一个容器被配置为解析NHibernate SessionFactory和您的IMembershipProvider. 我喜欢使用几个“安装程序”配置我的城堡容器.每个安装程序都负责不同类型的依赖关系,所以我有一个Controller安装程序,一个NHibernate安装程序,一个Provider安装程序. 首先我们有ContainerFactory: public class ContainerFactory
{
private static IWindsorContainer container;
private static readonly object SyncObject = new object();
public static IWindsorContainer Current()
{
if (container == null)
{
lock (SyncObject)
{
if (container == null)
{
container = new WindsorContainer();
container.Install(new ControllerInstaller());
container.Install(new NHibernateInstaller());
container.Install(new ProviderInstaller());
}
}
}
return container;
}
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET的BlogEngine.Net堆栈到WordPress?
- asp.net – 授权属性中的UrlHelper和ViewContext
- asp.net-mvc – ASP.NET MVC不提供默认文档
- asp.net-mvc – ApplicationDbContext – 它在项目中的位置
- asp.net-mvc – 在部署MVC 2 Web应用程序时要绝对检查的事项
- 实体框架 – 使用Azure表存储的Code FirstIdentity
- asp.net-mvc – 在asp.net MVC 3中授权登录URL
- asp.net-mvc – 用VB.net 2008开始ASP.NET MVC
- asp.net-mvc – 修改后ASP.NET包缓存不清除
- asp.net-mvc – ASP.NET MVC RememberMe
- asp.net-mvc – MVC4 Razor对大括号感到困惑
- ASP.NET Core 2.0仅在共享文件夹中查找视图
- asp.net-mvc – 通过Web Api接收,发送文件
- ASP.NET Response.Cache.SetNoStore()与Response
- VS 2015预览缺少“ASP.NET 5 Web应用程序”项目类
- 写单元测试在ASP.NET Web API中使用User.Identit
- asp.net – 如何减缓黑客的速度
- asp.net %$...%语法
- asp.net-mvc – RequireHttps导致Amazon Elastic
- asp.net – 为什么当使用ADO.NET实体数据模型映射
