mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Incremental work towards infoset field storage
--HG-- branch : dev
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.ContentManagement.Drivers.FieldStorage;
|
||||
using Orchard.ContentManagement.MetaData.Builders;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
|
||||
[TestFixture]
|
||||
public class FieldStorageProviderSelectorTests {
|
||||
private IContainer _container;
|
||||
private IFieldStorageProviderSelector _selector;
|
||||
|
||||
[SetUp]
|
||||
public void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterType<FieldStorageProviderSelector>().As<IFieldStorageProviderSelector>();
|
||||
builder.RegisterType<InfosetFieldStorageProvider>().As<IFieldStorageProvider>();
|
||||
builder.RegisterType<TestProvider>().As<IFieldStorageProvider>();
|
||||
|
||||
_container = builder.Build();
|
||||
_selector = _container.Resolve<IFieldStorageProviderSelector>();
|
||||
}
|
||||
|
||||
class TestProvider : IFieldStorageProvider {
|
||||
public string ProviderName {
|
||||
get { return "TestProvName"; }
|
||||
}
|
||||
|
||||
public IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldReturnProviderByName() {
|
||||
var part1Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("Hello", fb => fb.OfType("Text").WithSetting("Storage", "TestProvName"))
|
||||
.Build();
|
||||
var part2Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", "Infoset"))
|
||||
.Build();
|
||||
|
||||
var provider1 = _selector.GetProvider(part1Definition.Fields.Single());
|
||||
var provider2 = _selector.GetProvider(part2Definition.Fields.Single());
|
||||
|
||||
Assert.That(provider1.ProviderName, Is.EqualTo("TestProvName"));
|
||||
Assert.That(provider2.ProviderName, Is.EqualTo("Infoset"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldReturnInfosetWhenNullEmptyMissingOrInvalid() {
|
||||
var part1Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("Hello", fb => fb.OfType("Text").WithSetting("Storage", null))
|
||||
.Build();
|
||||
var part2Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", ""))
|
||||
.Build();
|
||||
var part3Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("World", fb => fb.OfType("Text"))
|
||||
.Build();
|
||||
var part4Definition = new ContentPartDefinitionBuilder()
|
||||
.WithField("World", fb => fb.OfType("Text").WithSetting("Storage", "NoSuchName"))
|
||||
.Build();
|
||||
|
||||
var provider1 = _selector.GetProvider(part1Definition.Fields.Single());
|
||||
var provider2 = _selector.GetProvider(part2Definition.Fields.Single());
|
||||
var provider3 = _selector.GetProvider(part3Definition.Fields.Single());
|
||||
var provider4 = _selector.GetProvider(part4Definition.Fields.Single());
|
||||
|
||||
Assert.That(provider1.ProviderName, Is.EqualTo("Infoset"));
|
||||
Assert.That(provider2.ProviderName, Is.EqualTo("Infoset"));
|
||||
Assert.That(provider3.ProviderName, Is.EqualTo("Infoset"));
|
||||
Assert.That(provider4.ProviderName, Is.EqualTo("Infoset"));
|
||||
}
|
||||
}
|
||||
}
|
@@ -151,6 +151,7 @@
|
||||
<Compile Include="ContentManagement\DefaultContentManagerTests.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\FieldStorageProviderSelectorTests.cs" />
|
||||
<Compile Include="ContentManagement\Handlers\ContentHandlerTests.cs" />
|
||||
<Compile Include="ContentManagement\Handlers\ModelBuilderTests.cs" />
|
||||
<Compile Include="ContentManagement\MetaData\Builders\ContentTypeDefinitionBuilderTests.cs" />
|
||||
|
@@ -1,21 +1,15 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement.Drivers.FieldStorage;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers {
|
||||
|
||||
public interface IContentFieldDriver : IEvents {
|
||||
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
|
||||
DriverResult BuildEditorModel(BuildEditorModelContext context);
|
||||
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
|
||||
|
||||
IEnumerable<ContentFieldInfo> GetFieldInfo();
|
||||
}
|
||||
|
||||
public abstract class ContentFieldDriver<TField> : IContentFieldDriver where TField : ContentField, new() {
|
||||
protected virtual string Prefix { get { return ""; } }
|
||||
protected virtual string Zone { get { return "body"; } }
|
||||
public IFieldStorageProviderSelector FieldStorageProviderSelector { get; set; }
|
||||
|
||||
DriverResult IContentFieldDriver.BuildDisplayModel(BuildDisplayModelContext context) {
|
||||
var results = context.ContentItem.Parts.SelectMany(part => part.Fields).
|
||||
@@ -42,13 +36,23 @@ namespace Orchard.ContentManagement.Drivers {
|
||||
var contentFieldInfo = new[] {
|
||||
new ContentFieldInfo {
|
||||
FieldTypeName = typeof (TField).Name,
|
||||
Factory = partFieldDefinition => new TField {PartFieldDefinition = partFieldDefinition}
|
||||
Factory = FieldInstanceFactory
|
||||
}
|
||||
};
|
||||
|
||||
return contentFieldInfo;
|
||||
}
|
||||
|
||||
private TField FieldInstanceFactory(ContentPartDefinition.Field partFieldDefinition) {
|
||||
var fieldStorageProvider = FieldStorageProviderSelector.GetProvider(partFieldDefinition);
|
||||
var fieldStorage = fieldStorageProvider.BindStorage(partFieldDefinition);
|
||||
return new TField {
|
||||
PartFieldDefinition = partFieldDefinition,
|
||||
Getter = fieldStorage.Getter,
|
||||
Setter = fieldStorage.Setter,
|
||||
};
|
||||
}
|
||||
|
||||
protected virtual DriverResult Display(TField field, string displayType) { return null; }
|
||||
protected virtual DriverResult Editor(TField field) { return null; }
|
||||
protected virtual DriverResult Editor(TField field, IUpdateModel updater) { return null; }
|
||||
|
@@ -3,15 +3,6 @@ using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers {
|
||||
|
||||
public interface IContentPartDriver : IEvents {
|
||||
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
|
||||
DriverResult BuildEditorModel(BuildEditorModelContext context);
|
||||
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
|
||||
|
||||
IEnumerable<ContentPartInfo> GetPartInfo();
|
||||
}
|
||||
|
||||
public abstract class ContentPartDriver<TContent> : IContentPartDriver where TContent : ContentPart, new() {
|
||||
protected virtual string Prefix { get { return ""; } }
|
||||
protected virtual string Zone { get { return "body"; } }
|
||||
|
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers.FieldStorage {
|
||||
public class FieldStorageProviderSelector : IFieldStorageProviderSelector {
|
||||
public const string Storage = "Storage";
|
||||
public const string DefaultProviderName = "Infoset";
|
||||
|
||||
private readonly IEnumerable<IFieldStorageProvider> _storageProviders;
|
||||
|
||||
public FieldStorageProviderSelector(IEnumerable<IFieldStorageProvider> storageProviders) {
|
||||
_storageProviders = storageProviders;
|
||||
}
|
||||
|
||||
public IFieldStorageProvider GetProvider(ContentPartDefinition.Field partFieldDefinition) {
|
||||
|
||||
IFieldStorageProvider provider = null;
|
||||
|
||||
string storage;
|
||||
if (partFieldDefinition.Settings.TryGetValue(Storage, out storage))
|
||||
provider = Locate(storage);
|
||||
|
||||
return provider ?? Locate(DefaultProviderName);
|
||||
}
|
||||
|
||||
private IFieldStorageProvider Locate(string providerName) {
|
||||
return _storageProviders.FirstOrDefault(provider => provider.ProviderName == providerName);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers.FieldStorage {
|
||||
public interface IFieldStorage {
|
||||
Func<string, string> Getter { get; }
|
||||
Action<string, string> Setter { get; }
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers.FieldStorage {
|
||||
public interface IFieldStorageProvider : IDependency {
|
||||
string ProviderName { get; }
|
||||
IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition);
|
||||
}
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers.FieldStorage {
|
||||
public interface IFieldStorageProviderSelector : IDependency {
|
||||
IFieldStorageProvider GetProvider(ContentPartDefinition.Field partFieldDefinition);
|
||||
}
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers.FieldStorage {
|
||||
public class InfosetFieldStorageProvider : IFieldStorageProvider {
|
||||
public string ProviderName {
|
||||
get { return FieldStorageProviderSelector.DefaultProviderName; }
|
||||
}
|
||||
|
||||
public IFieldStorage BindStorage(ContentPartDefinition.Field partFieldDefinition) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
13
src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs
Normal file
13
src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers {
|
||||
public interface IContentFieldDriver : IEvents {
|
||||
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
|
||||
DriverResult BuildEditorModel(BuildEditorModelContext context);
|
||||
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
|
||||
|
||||
IEnumerable<ContentFieldInfo> GetFieldInfo();
|
||||
}
|
||||
}
|
13
src/Orchard/ContentManagement/Drivers/IContentPartDriver.cs
Normal file
13
src/Orchard/ContentManagement/Drivers/IContentPartDriver.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
|
||||
namespace Orchard.ContentManagement.Drivers {
|
||||
public interface IContentPartDriver : IEvents {
|
||||
DriverResult BuildDisplayModel(BuildDisplayModelContext context);
|
||||
DriverResult BuildEditorModel(BuildEditorModelContext context);
|
||||
DriverResult UpdateEditorModel(UpdateEditorModelContext context);
|
||||
|
||||
IEnumerable<ContentPartInfo> GetPartInfo();
|
||||
}
|
||||
}
|
@@ -12,5 +12,6 @@ namespace Orchard.ContentManagement.Records {
|
||||
public virtual ContentTypeRecord ContentType { get; set; }
|
||||
public virtual IList<ContentItemVersionRecord> Versions { get; set; }
|
||||
|
||||
public virtual IList<ContentItemVersionRecord> Infoset { get; set; }
|
||||
}
|
||||
}
|
@@ -192,9 +192,16 @@
|
||||
<Compile Include="ContentManagement\Drivers\DriverResult.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\FieldStorageProviderSelector.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\IContentFieldDriver.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\IContentItemDriver.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ContentManagement\Drivers\IContentPartDriver.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorage.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorageProvider.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\IFieldStorageProviderSelector.cs" />
|
||||
<Compile Include="ContentManagement\Drivers\FieldStorage\InfosetFieldStorageProvider.cs" />
|
||||
<Compile Include="ContentManagement\Extenstions\UrlHelperExtensions.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
Reference in New Issue
Block a user