diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
index 4a39036af..02ed1d16f 100644
--- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj
+++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
@@ -320,6 +320,7 @@
+
diff --git a/src/Orchard.Tests/Services/YamlParserTests.cs b/src/Orchard.Tests/Services/YamlParserTests.cs
new file mode 100644
index 000000000..19ece43fa
--- /dev/null
+++ b/src/Orchard.Tests/Services/YamlParserTests.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NUnit.Framework;
+using Newtonsoft.Json.Linq;
+using Orchard.Services;
+
+namespace Orchard.Tests.Services {
+
+ [TestFixture]
+ public class YamlParserTests {
+
+ [Test]
+ public void ShouldConvertYamlToWellknowType() {
+ var parser = new YamlParser();
+ var yaml = SampleYamlDocument;
+
+ var order = parser.Deserialize(yaml);
+
+ Assert.AreEqual("Nikola", order.Customer.FirstName);
+ Assert.AreEqual(2, order.Items.Count);
+ }
+
+ [Test]
+ public void ShouldConvertYamlToDynamic()
+ {
+ var parser = new YamlParser();
+ var yaml = SampleYamlDocument;
+
+ var order = parser.Deserialize(yaml);
+
+ Assert.AreEqual("Nikola", (string)order.Customer.FirstName);
+ Assert.AreEqual(2, (int)order.Items.Count);
+ }
+
+ public class Order {
+ public DateTime Date { get; set; }
+ public Customer Customer { get; set; }
+ public IList Items { get; set; }
+ }
+
+ public class OrderItem {
+ public string Product { get; set; }
+ public int Quantity { get; set; }
+ public decimal Price { get; set; }
+ }
+
+ public class Customer {
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+
+ }
+
+ private const string SampleYamlDocument =
+@"
+Date: 1916-04-01
+Customer:
+ FirstName: Nikola
+ LastName: Tesla
+Items:
+ - Product: Bulb
+ Quantity: 1
+ Price: 1.46
+
+ - Product: Wire
+ Quantity: 1
+ Price: 0.32
+";
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
index 66ccc72b6..38987ec69 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj
@@ -102,14 +102,6 @@
-
- ..\..\..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll
- True
-
-
- ..\..\..\packages\YamlDotNet.Dynamic.3.2.3\lib\net40\YamlDotNet.Dynamic.dll
- True
-
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs
index 3369c7132..1333ef9c5 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs
@@ -17,10 +17,10 @@ using Orchard.Layouts.Services;
using Orchard.Layouts.Shapes;
using Orchard.Layouts.ViewModels;
using Orchard.Localization;
+using Orchard.Services;
using Orchard.Themes.Services;
using Orchard.Tokens;
using Orchard.Utility.Extensions;
-using YamlDotNet.Dynamic;
namespace Orchard.Layouts.Providers {
[OrchardFeature("Orchard.Layouts.Snippets")]
@@ -34,6 +34,7 @@ namespace Orchard.Layouts.Providers {
private readonly Work _currentThemeShapeBindingResolver;
private readonly Work _tokenizer;
private readonly IWorkContextAccessor _wca;
+ private readonly Work _yamlParser;
public SnippetElementHarvester(
IWorkContextAccessor workContextAccessor,
@@ -43,7 +44,8 @@ namespace Orchard.Layouts.Providers {
Work elementFactory,
Work shapeDisplay,
Work tokenizer,
- Work currentThemeShapeBindingResolver) {
+ Work currentThemeShapeBindingResolver,
+ Work yamlParser) {
_shapeFactory = shapeFactory;
_siteThemeService = siteThemeService;
@@ -52,6 +54,7 @@ namespace Orchard.Layouts.Providers {
_shapeDisplay = shapeDisplay;
_tokenizer = tokenizer;
_currentThemeShapeBindingResolver = currentThemeShapeBindingResolver;
+ _yamlParser = yamlParser;
_wca = workContextAccessor;
}
@@ -146,7 +149,7 @@ namespace Orchard.Layouts.Providers {
return null;
var yaml = File.ReadAllText(paramsFileName);
- var snippetConfig = Deserialize(yaml);
+ var snippetConfig = _yamlParser.Value.Deserialize(yaml);
var fieldsConfig = snippetConfig.Fields != null ? snippetConfig.Fields.Children : new dynamic[0];
var descriptor = new SnippetDescriptor();
@@ -199,9 +202,5 @@ namespace Orchard.Layouts.Providers {
var markup = File.ReadAllText(localFileName);
return markup.Contains("@Html.SnippetField");
}
-
- private dynamic Deserialize(string yaml) {
- return new DynamicYaml(yaml);
- }
}
}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/packages.config b/src/Orchard.Web/Modules/Orchard.Layouts/packages.config
index 22c39f3eb..61ca9fb6f 100644
--- a/src/Orchard.Web/Modules/Orchard.Layouts/packages.config
+++ b/src/Orchard.Web/Modules/Orchard.Layouts/packages.config
@@ -7,6 +7,4 @@
-
-
\ No newline at end of file
diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj
index 9b469678e..be276337b 100644
--- a/src/Orchard/Orchard.Framework.csproj
+++ b/src/Orchard/Orchard.Framework.csproj
@@ -170,6 +170,10 @@
..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll
True
+
+ ..\packages\YamlDotNet.Dynamic.3.2.3\lib\net40\YamlDotNet.Dynamic.dll
+ True
+
@@ -423,7 +427,9 @@
+
+
diff --git a/src/Orchard/Services/IYamlParser.cs b/src/Orchard/Services/IYamlParser.cs
new file mode 100644
index 000000000..cf9ea5f2c
--- /dev/null
+++ b/src/Orchard/Services/IYamlParser.cs
@@ -0,0 +1,21 @@
+namespace Orchard.Services {
+ ///
+ /// Provides methods to deserialize objects from YAML documents.
+ ///
+ public interface IYamlParser : IDependency {
+ ///
+ /// Deserializes a YAML document to a dynamic object.
+ ///
+ /// The YAML document to deserialize.
+ /// The deserialized object.
+ dynamic Deserialize(string yaml);
+
+ ///
+ /// Deserializes a YAML document to a specific object.
+ ///
+ /// The type of the object to deserialize.
+ /// The YAML document to deserialize.
+ /// The deserialized object.
+ T Deserialize(string yaml);
+ }
+}
diff --git a/src/Orchard/Services/YamlParser.cs b/src/Orchard/Services/YamlParser.cs
new file mode 100644
index 000000000..b783aad5c
--- /dev/null
+++ b/src/Orchard/Services/YamlParser.cs
@@ -0,0 +1,19 @@
+using System.IO;
+using YamlDotNet.Dynamic;
+using YamlDotNet.Serialization;
+using YamlDotNet.Serialization.NamingConventions;
+
+namespace Orchard.Services {
+ public class YamlParser : IYamlParser {
+ public dynamic Deserialize(string yaml) {
+ return new DynamicYaml(yaml);
+ }
+
+ public T Deserialize(string yaml) {
+ var deserializer = new Deserializer(namingConvention: new PascalCaseNamingConvention(), ignoreUnmatched: true);
+ using (var reader = new StringReader(yaml)) {
+ return deserializer.Deserialize(reader);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/packages.config b/src/Orchard/packages.config
index c25a4d246..f5f57f9e4 100644
--- a/src/Orchard/packages.config
+++ b/src/Orchard/packages.config
@@ -18,4 +18,5 @@
+
\ No newline at end of file