mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-23 21:13:35 +08:00
Adding some spike/concept work as context to refine model processing.
--HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4041259
This commit is contained in:
54
src/Orchard.Web/Core/Common/Models/CommonDriver.cs
Normal file
54
src/Orchard.Web/Core/Common/Models/CommonDriver.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using Orchard.Core.Common.Records;
|
||||||
|
using Orchard.Data;
|
||||||
|
using Orchard.Models;
|
||||||
|
using Orchard.Models.Driver;
|
||||||
|
using Orchard.Security;
|
||||||
|
using Orchard.Services;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class CommonDriver : ModelDriverWithRecord<CommonRecord> {
|
||||||
|
private readonly IClock _clock;
|
||||||
|
private readonly IAuthenticationService _authenticationService;
|
||||||
|
private readonly IModelManager _modelManager;
|
||||||
|
|
||||||
|
public CommonDriver(
|
||||||
|
IRepository<CommonRecord> repository,
|
||||||
|
IClock clock,
|
||||||
|
IAuthenticationService authenticationService,
|
||||||
|
IModelManager modelManager)
|
||||||
|
: base(repository) {
|
||||||
|
_clock = clock;
|
||||||
|
_authenticationService = authenticationService;
|
||||||
|
_modelManager = modelManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Create(CreateModelContext context) {
|
||||||
|
var instance = context.Instance.As<CommonModel>();
|
||||||
|
if (instance != null && instance.Record != null) {
|
||||||
|
if (instance.Record.CreatedUtc == null) {
|
||||||
|
instance.Record.CreatedUtc = _clock.UtcNow;
|
||||||
|
}
|
||||||
|
if (instance.Record.ModifiedUtc == null) {
|
||||||
|
instance.Record.ModifiedUtc = _clock.UtcNow;
|
||||||
|
}
|
||||||
|
if (instance.Record.OwnerId == 0) {
|
||||||
|
instance.Owner = _authenticationService.GetAuthenticatedUser();
|
||||||
|
if (instance.Owner != null)
|
||||||
|
instance.Record.OwnerId = instance.Owner.Id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base.Create(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Loaded(LoadModelContext context) {
|
||||||
|
var instance = context.Instance.As<CommonModel>();
|
||||||
|
if (instance != null && instance.Record != null) {
|
||||||
|
if (instance.Record.OwnerId != 0) {
|
||||||
|
instance.Owner = _modelManager.Get(instance.Record.OwnerId).As<IUser>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
base.Loaded(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
src/Orchard.Web/Core/Common/Models/CommonModel.cs
Normal file
9
src/Orchard.Web/Core/Common/Models/CommonModel.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using Orchard.Core.Common.Records;
|
||||||
|
using Orchard.Models;
|
||||||
|
using Orchard.Security;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class CommonModel : ModelPartWithRecord<CommonRecord> {
|
||||||
|
public IUser Owner { get; set; }
|
||||||
|
}
|
||||||
|
}
|
7
src/Orchard.Web/Core/Common/Models/ContentDriver.cs
Normal file
7
src/Orchard.Web/Core/Common/Models/ContentDriver.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
using Orchard.Models.Driver;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class ContentDriver : ModelDriver {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
8
src/Orchard.Web/Core/Common/Models/ContentModel.cs
Normal file
8
src/Orchard.Web/Core/Common/Models/ContentModel.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using Orchard.Models;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class ContentModel : ModelPart {
|
||||||
|
public string Body { get; set; }
|
||||||
|
public string Format { get; set; }
|
||||||
|
}
|
||||||
|
}
|
10
src/Orchard.Web/Core/Common/Models/RoutableDriver.cs
Normal file
10
src/Orchard.Web/Core/Common/Models/RoutableDriver.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using Orchard.Core.Common.Records;
|
||||||
|
using Orchard.Data;
|
||||||
|
using Orchard.Models.Driver;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class RoutableDriver : ModelDriverWithRecord<RoutableRecord> {
|
||||||
|
public RoutableDriver(IRepository<RoutableRecord> repository) : base(repository) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
src/Orchard.Web/Core/Common/Models/RoutableModel.cs
Normal file
7
src/Orchard.Web/Core/Common/Models/RoutableModel.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
using Orchard.Core.Common.Records;
|
||||||
|
using Orchard.Models;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Models {
|
||||||
|
public class RoutableModel : ModelPartWithRecord<RoutableRecord> {
|
||||||
|
}
|
||||||
|
}
|
1
src/Orchard.Web/Core/Common/Package.txt
Normal file
1
src/Orchard.Web/Core/Common/Package.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Name: Content
|
10
src/Orchard.Web/Core/Common/Records/CommonRecord.cs
Normal file
10
src/Orchard.Web/Core/Common/Records/CommonRecord.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
using Orchard.Models.Records;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Records {
|
||||||
|
public class CommonRecord : ModelPartRecord {
|
||||||
|
public virtual int OwnerId { get; set; }
|
||||||
|
public virtual DateTime? CreatedUtc { get; set; }
|
||||||
|
public virtual DateTime? ModifiedUtc { get; set; }
|
||||||
|
}
|
||||||
|
}
|
8
src/Orchard.Web/Core/Common/Records/RoutableRecord.cs
Normal file
8
src/Orchard.Web/Core/Common/Records/RoutableRecord.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using Orchard.Models.Records;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Common.Records {
|
||||||
|
public class RoutableRecord : ModelPartRecord {
|
||||||
|
public virtual string Title { get; set; }
|
||||||
|
public virtual string Slug { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@@ -61,6 +61,14 @@
|
|||||||
<Reference Include="System.Web.Mobile" />
|
<Reference Include="System.Web.Mobile" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Common\Models\CommonDriver.cs" />
|
||||||
|
<Compile Include="Common\Models\CommonModel.cs" />
|
||||||
|
<Compile Include="Common\Models\ContentDriver.cs" />
|
||||||
|
<Compile Include="Common\Models\ContentModel.cs" />
|
||||||
|
<Compile Include="Common\Models\RoutableModel.cs" />
|
||||||
|
<Compile Include="Common\Models\RoutableDriver.cs" />
|
||||||
|
<Compile Include="Common\Records\CommonRecord.cs" />
|
||||||
|
<Compile Include="Common\Records\RoutableRecord.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="XmlRpc\Controllers\HomeController.cs" />
|
<Compile Include="XmlRpc\Controllers\HomeController.cs" />
|
||||||
<Compile Include="XmlRpc\Controllers\LiveWriterController.cs" />
|
<Compile Include="XmlRpc\Controllers\LiveWriterController.cs" />
|
||||||
@@ -76,6 +84,7 @@
|
|||||||
<Compile Include="XmlRpc\XmlRpcContext.cs" />
|
<Compile Include="XmlRpc\XmlRpcContext.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="Common\Package.txt" />
|
||||||
<Content Include="Web.config" />
|
<Content Include="Web.config" />
|
||||||
<Content Include="XmlRpc\Package.txt" />
|
<Content Include="XmlRpc\Package.txt" />
|
||||||
<Content Include="XmlRpc\Views\Home\Index.aspx" />
|
<Content Include="XmlRpc\Views\Home\Index.aspx" />
|
||||||
@@ -117,7 +126,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>52289</DevelopmentServerPort>
|
<DevelopmentServerPort>53609</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -177,7 +177,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>65251</DevelopmentServerPort>
|
<DevelopmentServerPort>53589</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -143,7 +143,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>65259</DevelopmentServerPort>
|
<DevelopmentServerPort>53597</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -127,7 +127,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>18551</DevelopmentServerPort>
|
<DevelopmentServerPort>53605</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -127,7 +127,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>65271</DevelopmentServerPort>
|
<DevelopmentServerPort>53601</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -7,7 +7,7 @@ namespace Orchard.Wikis {
|
|||||||
public void GetNavigation(NavigationBuilder builder) {
|
public void GetNavigation(NavigationBuilder builder) {
|
||||||
builder.Add("Wiki", "9",
|
builder.Add("Wiki", "9",
|
||||||
menu => menu
|
menu => menu
|
||||||
.Add("Wiki Pages", "1.0", item => item.Action("Index", "Admin", new { area = "Orchard.Wiki" }))
|
.Add("Wiki Pages", "1.0", item => item.Action("Index", "Admin", new { area = "Orchard.Wikis" }))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,33 @@
|
|||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
|
using Orchard.Core.Common.Models;
|
||||||
|
using Orchard.Models;
|
||||||
using Orchard.Mvc.ViewModels;
|
using Orchard.Mvc.ViewModels;
|
||||||
|
using Orchard.Security;
|
||||||
|
|
||||||
namespace Orchard.Wikis.Controllers
|
namespace Orchard.Wikis.Controllers {
|
||||||
{
|
public class AdminController : Controller {
|
||||||
public class AdminController : Controller
|
private readonly IModelManager _modelManager;
|
||||||
{
|
|
||||||
public ActionResult Index()
|
public AdminController(IModelManager modelManager) {
|
||||||
{
|
_modelManager = modelManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActionResult Index() {
|
||||||
return View(new AdminViewModel());
|
return View(new AdminViewModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IUser CurrentUser { get; set; }
|
||||||
|
|
||||||
|
public ActionResult Create() {
|
||||||
|
var page = _modelManager.New("wikipage");
|
||||||
|
_modelManager.Create(page);
|
||||||
|
|
||||||
|
return RedirectToAction("View", new{page.Id});
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActionResult View(int id) {
|
||||||
|
var page = _modelManager.Get(id).As<CommonModel>();
|
||||||
|
return View(page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using Orchard.Core.Common.Models;
|
||||||
|
using Orchard.Models.Driver;
|
||||||
|
|
||||||
|
namespace Orchard.Wikis.Models {
|
||||||
|
public class WikiPageDriver : ModelDriver {
|
||||||
|
protected override void New(NewModelContext context) {
|
||||||
|
if (context.ModelType == "wikipage") {
|
||||||
|
context.Builder
|
||||||
|
.Weld<CommonModel>()
|
||||||
|
.Weld<RoutableModel>()
|
||||||
|
.Weld<ContentModel>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -63,6 +63,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AdminMenu.cs" />
|
<Compile Include="AdminMenu.cs" />
|
||||||
<Compile Include="Controllers\AdminController.cs" />
|
<Compile Include="Controllers\AdminController.cs" />
|
||||||
|
<Compile Include="Models\WikiPageDriver.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -76,11 +77,14 @@
|
|||||||
<Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project>
|
<Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project>
|
||||||
<Name>Orchard</Name>
|
<Name>Orchard</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Core\Orchard.Core.csproj">
|
||||||
|
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
|
||||||
|
<Name>Orchard.Core</Name>
|
||||||
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="App_Data\" />
|
<Folder Include="App_Data\" />
|
||||||
<Folder Include="Content\" />
|
<Folder Include="Content\" />
|
||||||
<Folder Include="Models\" />
|
|
||||||
<Folder Include="Scripts\" />
|
<Folder Include="Scripts\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
@@ -114,7 +118,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>1275</DevelopmentServerPort>
|
<DevelopmentServerPort>53613</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
<% Html.BeginForm(); %>
|
<% Html.BeginForm(); %>
|
||||||
<div class="yui-g">
|
<div class="yui-g">
|
||||||
<h2>Wiki Admin</h2>
|
<h2>Wiki Admin</h2>
|
||||||
|
<p><%=Html.ActionLink("Create", "Create") %></p>
|
||||||
</div>
|
</div>
|
||||||
<% Html.EndForm(); %>
|
<% Html.EndForm(); %>
|
||||||
<% Html.Include("Footer"); %>
|
<% Html.Include("Footer"); %>
|
||||||
|
@@ -151,7 +151,7 @@
|
|||||||
<WebProjectProperties>
|
<WebProjectProperties>
|
||||||
<UseIIS>False</UseIIS>
|
<UseIIS>False</UseIIS>
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
<DevelopmentServerPort>65255</DevelopmentServerPort>
|
<DevelopmentServerPort>53593</DevelopmentServerPort>
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
<IISUrl>
|
<IISUrl>
|
||||||
</IISUrl>
|
</IISUrl>
|
||||||
|
@@ -8,6 +8,7 @@ using FluentNHibernate.Cfg;
|
|||||||
using FluentNHibernate.Cfg.Db;
|
using FluentNHibernate.Cfg.Db;
|
||||||
using NHibernate;
|
using NHibernate;
|
||||||
using NHibernate.Tool.hbm2ddl;
|
using NHibernate.Tool.hbm2ddl;
|
||||||
|
using Orchard.Models;
|
||||||
|
|
||||||
namespace Orchard.Data {
|
namespace Orchard.Data {
|
||||||
public class HackSessionLocator : ISessionLocator, IDisposable {
|
public class HackSessionLocator : ISessionLocator, IDisposable {
|
||||||
@@ -28,6 +29,7 @@ namespace Orchard.Data {
|
|||||||
CreatePersistenceModel(Assembly.Load("Orchard.Users")),
|
CreatePersistenceModel(Assembly.Load("Orchard.Users")),
|
||||||
CreatePersistenceModel(Assembly.Load("Orchard.Roles")),
|
CreatePersistenceModel(Assembly.Load("Orchard.Roles")),
|
||||||
CreatePersistenceModel(Assembly.Load("Orchard")),
|
CreatePersistenceModel(Assembly.Load("Orchard")),
|
||||||
|
CreatePersistenceModel(Assembly.Load("Orchard.Core")),
|
||||||
};
|
};
|
||||||
|
|
||||||
return _sessionFactory ??
|
return _sessionFactory ??
|
||||||
@@ -48,18 +50,19 @@ namespace Orchard.Data {
|
|||||||
|
|
||||||
private static AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
|
private static AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
|
||||||
return AutoMap.Assembly(assembly)
|
return AutoMap.Assembly(assembly)
|
||||||
.Where(IsModelType)
|
.Where(IsRecordType)
|
||||||
.Alterations(alt => alt
|
.Alterations(alt => alt
|
||||||
.Add(new AutoMappingOverrideAlteration(assembly))
|
.Add(new AutoMappingOverrideAlteration(assembly))
|
||||||
.AddFromAssemblyOf<DataModule>())
|
.AddFromAssemblyOf<DataModule>())
|
||||||
.Conventions.AddFromAssemblyOf<DataModule>();
|
.Conventions.AddFromAssemblyOf<DataModule>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsModelType(Type type) {
|
private static bool IsRecordType(Type type) {
|
||||||
return (type.Namespace.EndsWith(".Models") || type.Namespace.EndsWith(".Records")) &&
|
return (type.Namespace.EndsWith(".Models") || type.Namespace.EndsWith(".Records")) &&
|
||||||
type.GetProperty("Id") != null &&
|
type.GetProperty("Id") != null &&
|
||||||
!type.IsSealed &&
|
!type.IsSealed &&
|
||||||
!type.IsAbstract;
|
!type.IsAbstract &&
|
||||||
|
!typeof(IModel).IsAssignableFrom(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISession For(Type entityType) {
|
public ISession For(Type entityType) {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
|
using Autofac;
|
||||||
using Orchard.Data;
|
using Orchard.Data;
|
||||||
using Orchard.Models.Driver;
|
using Orchard.Models.Driver;
|
||||||
using Orchard.Models.Records;
|
using Orchard.Models.Records;
|
||||||
@@ -8,19 +9,28 @@ using Orchard.UI.Models;
|
|||||||
|
|
||||||
namespace Orchard.Models {
|
namespace Orchard.Models {
|
||||||
public class DefaultModelManager : IModelManager {
|
public class DefaultModelManager : IModelManager {
|
||||||
private readonly IEnumerable<IModelDriver> _drivers;
|
private readonly IContext _context;
|
||||||
private readonly IRepository<ModelRecord> _modelRepository;
|
private readonly IRepository<ModelRecord> _modelRepository;
|
||||||
private readonly IRepository<ModelTypeRecord> _modelTypeRepository;
|
private readonly IRepository<ModelTypeRecord> _modelTypeRepository;
|
||||||
|
|
||||||
public DefaultModelManager(
|
public DefaultModelManager(
|
||||||
IEnumerable<IModelDriver> drivers,
|
IContext context,
|
||||||
IRepository<ModelRecord> modelRepository,
|
IRepository<ModelRecord> modelRepository,
|
||||||
IRepository<ModelTypeRecord> modelTypeRepository) {
|
IRepository<ModelTypeRecord> modelTypeRepository) {
|
||||||
_drivers = drivers;
|
_context = context;
|
||||||
_modelRepository = modelRepository;
|
_modelRepository = modelRepository;
|
||||||
_modelTypeRepository = modelTypeRepository;
|
_modelTypeRepository = modelTypeRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IEnumerable<IModelDriver> _drivers;
|
||||||
|
public IEnumerable<IModelDriver> Drivers {
|
||||||
|
get {
|
||||||
|
if (_drivers == null)
|
||||||
|
_drivers = _context.Resolve<IEnumerable<IModelDriver>>();
|
||||||
|
return _drivers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual IModel New(string modelType) {
|
public virtual IModel New(string modelType) {
|
||||||
|
|
||||||
// create a new kernel for the model instance
|
// create a new kernel for the model instance
|
||||||
@@ -30,12 +40,19 @@ namespace Orchard.Models {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// invoke drivers to weld aspects onto kernel
|
// invoke drivers to weld aspects onto kernel
|
||||||
foreach (var driver in _drivers) {
|
foreach (var driver in Drivers) {
|
||||||
driver.New(context);
|
driver.New(context);
|
||||||
}
|
}
|
||||||
|
var context2 = new NewedModelContext {
|
||||||
|
ModelType = modelType,
|
||||||
|
Instance = context.Builder.Build()
|
||||||
|
};
|
||||||
|
foreach (var driver in Drivers) {
|
||||||
|
driver.Newed(context2);
|
||||||
|
}
|
||||||
|
|
||||||
// composite result is returned
|
// composite result is returned
|
||||||
return context.Builder.Build();
|
return context2.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual IModel Get(int id) {
|
public virtual IModel Get(int id) {
|
||||||
@@ -54,9 +71,12 @@ namespace Orchard.Models {
|
|||||||
context.Instance.As<ModelRoot>().Id = context.Id;
|
context.Instance.As<ModelRoot>().Id = context.Id;
|
||||||
|
|
||||||
// invoke drivers to acquire state, or at least establish lazy loading callbacks
|
// invoke drivers to acquire state, or at least establish lazy loading callbacks
|
||||||
foreach (var driver in _drivers) {
|
foreach (var driver in Drivers) {
|
||||||
driver.Load(context);
|
driver.Load(context);
|
||||||
}
|
}
|
||||||
|
foreach (var driver in Drivers) {
|
||||||
|
driver.Loaded(context);
|
||||||
|
}
|
||||||
|
|
||||||
return context.Instance;
|
return context.Instance;
|
||||||
}
|
}
|
||||||
@@ -79,14 +99,17 @@ namespace Orchard.Models {
|
|||||||
|
|
||||||
|
|
||||||
// invoke drivers to add information to persistent stores
|
// invoke drivers to add information to persistent stores
|
||||||
foreach (var driver in _drivers) {
|
foreach (var driver in Drivers) {
|
||||||
driver.Create(context);
|
driver.Create(context);
|
||||||
}
|
}
|
||||||
|
foreach (var driver in Drivers) {
|
||||||
|
driver.Created(context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<ModelTemplate> GetEditors(IModel model) {
|
public IEnumerable<ModelTemplate> GetEditors(IModel model) {
|
||||||
var context = new GetModelEditorsContext(model);
|
var context = new GetModelEditorsContext(model);
|
||||||
foreach (var driver in _drivers) {
|
foreach (var driver in Drivers) {
|
||||||
driver.GetEditors(context);
|
driver.GetEditors(context);
|
||||||
}
|
}
|
||||||
return context.Editors;
|
return context.Editors;
|
||||||
@@ -94,7 +117,7 @@ namespace Orchard.Models {
|
|||||||
|
|
||||||
public IEnumerable<ModelTemplate> UpdateEditors(IModel model, IModelUpdater updater) {
|
public IEnumerable<ModelTemplate> UpdateEditors(IModel model, IModelUpdater updater) {
|
||||||
var context = new UpdateModelContext(model, updater);
|
var context = new UpdateModelContext(model, updater);
|
||||||
foreach (var driver in _drivers) {
|
foreach (var driver in Drivers) {
|
||||||
driver.UpdateEditors(context);
|
driver.UpdateEditors(context);
|
||||||
}
|
}
|
||||||
return context.Editors;
|
return context.Editors;
|
||||||
|
@@ -1,8 +1,11 @@
|
|||||||
namespace Orchard.Models.Driver {
|
namespace Orchard.Models.Driver {
|
||||||
public interface IModelDriver : IDependency {
|
public interface IModelDriver : IDependency {
|
||||||
void New(NewModelContext context);
|
void New(NewModelContext context);
|
||||||
|
void Newed(NewedModelContext context);
|
||||||
void Create(CreateModelContext context);
|
void Create(CreateModelContext context);
|
||||||
|
void Created(CreateModelContext context);
|
||||||
void Load(LoadModelContext context);
|
void Load(LoadModelContext context);
|
||||||
|
void Loaded(LoadModelContext context);
|
||||||
|
|
||||||
void GetEditors(GetModelEditorsContext context);
|
void GetEditors(GetModelEditorsContext context);
|
||||||
void UpdateEditors(UpdateModelContext context);
|
void UpdateEditors(UpdateModelContext context);
|
||||||
|
@@ -7,27 +7,28 @@ namespace Orchard.Models.Driver {
|
|||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILogger Logger{ get; set;}
|
public ILogger Logger { get; set; }
|
||||||
|
|
||||||
void IModelDriver.New(NewModelContext context) {New(context);}
|
void IModelDriver.New(NewModelContext context) { New(context); }
|
||||||
|
void IModelDriver.Newed(NewedModelContext context) { Newed(context); }
|
||||||
void IModelDriver.Create(CreateModelContext context) { Create(context); }
|
void IModelDriver.Create(CreateModelContext context) { Create(context); }
|
||||||
|
void IModelDriver.Created(CreateModelContext context) { Created(context); }
|
||||||
void IModelDriver.Load(LoadModelContext context) { Load(context); }
|
void IModelDriver.Load(LoadModelContext context) { Load(context); }
|
||||||
|
void IModelDriver.Loaded(LoadModelContext context) { Loaded(context); }
|
||||||
void IModelDriver.GetEditors(GetModelEditorsContext context) { GetEditors(context); }
|
void IModelDriver.GetEditors(GetModelEditorsContext context) { GetEditors(context); }
|
||||||
void IModelDriver.UpdateEditors(UpdateModelContext context) { UpdateEditors(context); }
|
void IModelDriver.UpdateEditors(UpdateModelContext context) { UpdateEditors(context); }
|
||||||
|
|
||||||
protected virtual void New(NewModelContext context) {
|
protected virtual void New(NewModelContext context) { }
|
||||||
}
|
protected virtual void Newed(NewedModelContext context) { }
|
||||||
|
|
||||||
protected virtual void Load(LoadModelContext context) {
|
protected virtual void Load(LoadModelContext context) { }
|
||||||
}
|
protected virtual void Loaded(LoadModelContext context) { }
|
||||||
|
|
||||||
protected virtual void Create(CreateModelContext context) {
|
protected virtual void Create(CreateModelContext context) { }
|
||||||
}
|
protected virtual void Created(CreateModelContext context) { }
|
||||||
|
|
||||||
protected virtual void GetEditors(GetModelEditorsContext context) {
|
protected virtual void GetEditors(GetModelEditorsContext context) {}
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void UpdateEditors(UpdateModelContext context) {
|
protected virtual void UpdateEditors(UpdateModelContext context) {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -2,26 +2,33 @@ using Orchard.Data;
|
|||||||
using Orchard.Models.Records;
|
using Orchard.Models.Records;
|
||||||
|
|
||||||
namespace Orchard.Models.Driver {
|
namespace Orchard.Models.Driver {
|
||||||
public abstract class ModelDriverWithRecord<TRecord> : ModelDriver where TRecord : ModelPartRecord {
|
public abstract class ModelDriverWithRecord<TRecord> : ModelDriver where TRecord : ModelPartRecord, new() {
|
||||||
private readonly IRepository<TRecord> _repository;
|
private readonly IRepository<TRecord> _repository;
|
||||||
|
|
||||||
public ModelDriverWithRecord(IRepository<TRecord> repository) {
|
protected ModelDriverWithRecord(IRepository<TRecord> repository) {
|
||||||
_repository = repository;
|
_repository = repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void Newed(NewedModelContext context) {
|
||||||
|
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
||||||
|
if (instance != null && instance.Record == null) {
|
||||||
|
instance.Record = new TRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Create(CreateModelContext context) {
|
protected override void Create(CreateModelContext context) {
|
||||||
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
||||||
if (instance != null && instance.Record != null) {
|
if (instance != null && instance.Record != null) {
|
||||||
instance.Record.Model = context.Record;
|
instance.Record.Model = context.Record;
|
||||||
_repository.Create(instance.Record);
|
_repository.Create(instance.Record);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Load(LoadModelContext context) {
|
protected override void Load(LoadModelContext context) {
|
||||||
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
|
||||||
if (instance != null) {
|
if (instance != null) {
|
||||||
instance.Record = _repository.Get(context.Id);
|
instance.Record = _repository.Get(context.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -3,4 +3,8 @@ namespace Orchard.Models.Driver {
|
|||||||
public string ModelType { get; set; }
|
public string ModelType { get; set; }
|
||||||
public ModelBuilder Builder { get; set; }
|
public ModelBuilder Builder { get; set; }
|
||||||
}
|
}
|
||||||
|
public class NewedModelContext {
|
||||||
|
public string ModelType { get; set; }
|
||||||
|
public IModel Instance { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Web.Mvc;
|
|
||||||
using Orchard.Models.Driver;
|
using Orchard.Models.Driver;
|
||||||
using Orchard.UI.Models;
|
using Orchard.UI.Models;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user