Changing the Getter/Setter deletages to an IFieldStorage interface

Deletages seemed inconsistent with design of rest of system
Interface allows for typed accessor methods, which will be important for columnar backing

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-06-28 17:21:19 -07:00
parent 21328875f3
commit 01f8617078
8 changed files with 67 additions and 40 deletions

View File

@@ -60,9 +60,9 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
public void GettingUnsetNamedAndUnnamedValueIsSafeAndNull() {
var part = CreateContentItemPart();
var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());
Assert.That(storage.Getter(null), Is.Null);
Assert.That(storage.Getter("value"), Is.Null);
Assert.That(storage.Getter("This is a test"), Is.Null);
Assert.That(storage.Get<string>(null), Is.Null);
Assert.That(storage.Get<string>("value"), Is.Null);
Assert.That(storage.Get<string>("This is a test"), Is.Null);
}
[Test]
@@ -70,10 +70,10 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
var part = CreateContentItemPart();
var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());
Assert.That(storage.Getter("alpha"), Is.Null);
storage.Setter("alpha", "one");
Assert.That(storage.Getter("alpha"), Is.Not.Null);
Assert.That(storage.Getter("alpha"), Is.EqualTo("one"));
Assert.That(storage.Get<string>("alpha"), Is.Null);
storage.Set("alpha", "one");
Assert.That(storage.Get<string>("alpha"), Is.Not.Null);
Assert.That(storage.Get<string>("alpha"), Is.EqualTo("one"));
}
[Test]
@@ -81,14 +81,14 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
var part = CreateContentItemPart();
var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());
Assert.That(storage.Getter(null), Is.Null);
Assert.That(storage.Getter(""), Is.Null);
storage.Setter(null, "one");
Assert.That(storage.Getter(null), Is.EqualTo("one"));
Assert.That(storage.Getter(""), Is.EqualTo("one"));
storage.Setter(null, "two");
Assert.That(storage.Getter(null), Is.EqualTo("two"));
Assert.That(storage.Getter(""), Is.EqualTo("two"));
Assert.That(storage.Get<string>(null), Is.Null);
Assert.That(storage.Get<string>(""), Is.Null);
storage.Set(null, "one");
Assert.That(storage.Get<string>(null), Is.EqualTo("one"));
Assert.That(storage.Get<string>(""), Is.EqualTo("one"));
storage.Set(null, "two");
Assert.That(storage.Get<string>(null), Is.EqualTo("two"));
Assert.That(storage.Get<string>(""), Is.EqualTo("two"));
}
[Test]
@@ -96,8 +96,8 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
var part = CreateContentItemPart();
var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());
storage.Setter(null, "one");
storage.Setter("alpha", "two");
storage.Set(null, "one");
storage.Set("alpha", "two");
Assert.That(part.ContentItem.Record.Data, Is.EqualTo("<Data><Foo><Bar alpha=\"two\">one</Bar></Foo></Data>"));
}
@@ -107,14 +107,14 @@ namespace Orchard.Tests.ContentManagement.Drivers.FieldStorage {
var part = CreateContentItemPart();
var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());
storage.Setter(null, "one");
storage.Setter("alpha", "two");
storage.Set(null, "one");
storage.Set("alpha", "two");
Assert.That(part.ContentItem.Record.Data, Is.EqualTo("<Data><Foo><Bar alpha=\"two\">one</Bar></Foo></Data>"));
part.ContentItem.Record.Data = "<Data><Foo><Bar alpha=\"four\">three</Bar></Foo></Data>";
storage.Setter(null, "three");
storage.Setter("alpha", "four");
storage.Set(null, "three");
storage.Set("alpha", "four");
}
[Test]

View File

@@ -1,10 +1,11 @@
using Orchard.ContentManagement;
using Orchard.ContentManagement.FieldStorage;
namespace Orchard.Core.Common.Fields {
public class TextField : ContentField {
public string Value {
get { return Getter(null); }
set { Setter(null, value); }
get { return Storage.Get<string>(); }
set { Storage.Set(value); }
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using Orchard.ContentManagement.FieldStorage;
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.ContentManagement {
@@ -8,7 +9,6 @@ namespace Orchard.ContentManagement {
public ContentPartDefinition.Field PartFieldDefinition { get; set; }
public ContentFieldDefinition FieldDefinition { get { return PartFieldDefinition.FieldDefinition; } }
public Func<string, string> Getter { get; set; }
public Action<string, string> Setter { get; set; }
public IFieldStorage Storage { protected get; set; }
}
}

View File

@@ -34,8 +34,7 @@ namespace Orchard.ContentManagement.Drivers {
FieldTypeName = typeof (TField).Name,
Factory = (partFieldDefinition, storage) => new TField {
PartFieldDefinition = partFieldDefinition,
Getter = storage.Getter,
Setter = storage.Setter,
Storage = storage,
}
}
};

View File

@@ -2,7 +2,15 @@
namespace Orchard.ContentManagement.FieldStorage {
public interface IFieldStorage {
Func<string, string> Getter { get; }
Action<string, string> Setter { get; }
T Get<T>(string name);
void Set<T>(string name, T value);
}
public static class FieldStorageExtension{
public static T Get<T>(this IFieldStorage storage) {
return storage.Get<T>(null);
}
public static void Set<T>(this IFieldStorage storage, T value) {
storage.Set(null, value);
}
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Xml;
using System.Xml;
using System.Xml.Linq;
using Orchard.ContentManagement.MetaData.Models;
@@ -14,10 +13,9 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage {
var fieldName = XmlConvert.EncodeLocalName(partFieldDefinition.Name);
var infosetPart = contentPart.As<InfosetPart>();
return new Storage {
Getter = name => Get(infosetPart.Infoset.Element, partName, fieldName, name),
Setter = (name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value)
};
return new SimpleFieldStorage(
name => Get(infosetPart.Infoset.Element, partName, fieldName, name),
(name, value) => Set(infosetPart.Infoset.Element, partName, fieldName, name, value));
}
private static string Get(XElement element, string partName, string fieldName, string valueName) {
@@ -57,10 +55,5 @@ namespace Orchard.ContentManagement.FieldStorage.InfosetStorage {
fieldElement.SetAttributeValue(XmlConvert.EncodeLocalName(valueName), value);
}
}
class Storage : IFieldStorage {
public Func<string, string> Getter { get; set; }
public Action<string, string> Setter { get; set; }
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Globalization;
namespace Orchard.ContentManagement.FieldStorage {
public class SimpleFieldStorage : IFieldStorage {
public SimpleFieldStorage(Func<string, string> getter, Action<string, string> setter) {
Getter = getter;
Setter = setter;
}
public Func<string, string> Getter { get; set; }
public Action<string, string> Setter { get; set; }
public T Get<T>(string name) {
var value = Getter(name);
return string.IsNullOrEmpty(value)
? default(T)
: (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
}
public void Set<T>(string name, T value) {
Setter(name, Convert.ToString(value, CultureInfo.InvariantCulture));
}
}
}

View File

@@ -207,6 +207,7 @@
</Compile>
<Compile Include="ContentManagement\FieldStorage\InfosetStorage\InfosetHandler.cs" />
<Compile Include="ContentManagement\FieldStorage\InfosetStorage\InfosetPart.cs" />
<Compile Include="ContentManagement\FieldStorage\SimpleFieldStorage.cs" />
<Compile Include="ContentManagement\Handlers\ActivatedContentContext.cs">
<SubType>Code</SubType>
</Compile>