Refactoring the base ModelDriver's weld-part method into a ModelBuilder that's passed as part of the NewModelContext

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4040852
This commit is contained in:
loudej
2009-11-16 18:21:42 +00:00
parent 5f659dbedb
commit 6114433e47
15 changed files with 77 additions and 25 deletions

View File

@@ -12,7 +12,7 @@ using Orchard.Tests.Models.Stubs;
namespace Orchard.Tests.Models {
[TestFixture]
public class DefaultModelBuilderTests {
public class DefaultModelManagerTests {
private IContainer _container;
private IModelManager _manager;
private ISessionFactory _sessionFactory;

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Orchard.Models.Driver;
using Orchard.Tests.Models.Stubs;
namespace Orchard.Tests.Models.Drivers {
[TestFixture]
public class ModelBuilderTests {
[Test]
public void BuilderShouldReturnWorkingModelWithTypeAndId() {
var builder = new ModelBuilder("foo");
var model = builder.Build();
Assert.That(model.ModelType, Is.EqualTo("foo"));
}
[Test]
public void IdShouldDefaultToZero() {
var builder = new ModelBuilder("foo");
var model = builder.Build();
Assert.That(model.Id, Is.EqualTo(0));
}
[Test]
public void WeldShouldAddPartToModel() {
var builder = new ModelBuilder("foo");
builder.Weld<Alpha>();
var model = builder.Build();
Assert.That(model.Is<Alpha>(), Is.True);
Assert.That(model.As<Alpha>(), Is.Not.Null);
Assert.That(model.Is<Beta>(), Is.False);
Assert.That(model.As<Beta>(), Is.Null);
}
}
}

View File

@@ -4,7 +4,7 @@ namespace Orchard.Tests.Models.Stubs {
public class AlphaDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "alpha") {
WeldModelPart<Alpha>(context);
context.Builder.Weld<Alpha>();
}
}
}

View File

@@ -8,7 +8,7 @@ namespace Orchard.Tests.Models.Stubs {
public class BetaDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "beta") {
WeldModelPart<Beta>(context);
context.Builder.Weld<Beta>();
}
}
}

View File

@@ -4,7 +4,7 @@ namespace Orchard.Tests.Models.Stubs {
public class FlavoredDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "beta" || context.ModelType == "alpha") {
WeldModelPart<Flavored>(context);
context.Builder.Weld<Flavored>();
}
}
}

View File

@@ -22,7 +22,7 @@ namespace Orchard.Tests.Models.Stubs {
protected override void New(NewModelContext context) {
if (context.ModelType == "gamma") {
WeldModelPart<Gamma>(context);
context.Builder.Weld<Gamma>();
}
}
}

View File

@@ -4,7 +4,7 @@ namespace Orchard.Tests.Models.Stubs {
public class StyledDriver : ModelDriver {
protected override void New(NewModelContext context) {
if (context.ModelType == "alpha") {
WeldModelPart<Styled>(context);
context.Builder.Weld<Styled>();
}
}
}

View File

@@ -105,7 +105,8 @@
<Compile Include="Environment\OrchardStarterTests.cs" />
<Compile Include="Localization\NullLocalizerTests.cs" />
<Compile Include="Logging\LoggingModuleTests.cs" />
<Compile Include="Models\DefaultModelBuilderTests.cs" />
<Compile Include="Models\DefaultModelManagerTests.cs" />
<Compile Include="Models\Drivers\ModelBuilderTests.cs" />
<Compile Include="Models\Stubs\Alpha.cs" />
<Compile Include="Models\Stubs\AlphaDriver.cs" />
<Compile Include="Models\Stubs\Beta.cs" />

View File

@@ -23,7 +23,7 @@ namespace Orchard.Roles.Models {
protected override void New(NewModelContext context) {
if (context.ModelType == "user") {
WeldModelPart<UserRolesModel>(context);
context.Builder.Weld<UserRolesModel>();
}
}

View File

@@ -3,12 +3,13 @@ using Orchard.Models.Driver;
namespace Orchard.Users.Models {
public class UserDriver : ModelDriverWithRecord<UserRecord> {
public UserDriver(IRepository<UserRecord> repository) : base(repository) {
public UserDriver(IRepository<UserRecord> repository)
: base(repository) {
}
protected override void New(NewModelContext context) {
if (context.ModelType == "user") {
WeldModelPart<UserModel>(context);
context.Builder.Weld<UserModel>();
}
}
}

View File

@@ -26,7 +26,7 @@ namespace Orchard.Models {
// create a new kernel for the model instance
var context = new NewModelContext {
ModelType = modelType,
Instance = new ModelRoot(modelType)
Builder = new ModelBuilder(modelType)
};
// invoke drivers to weld aspects onto kernel
@@ -35,7 +35,7 @@ namespace Orchard.Models {
}
// composite result is returned
return context.Instance;
return context.Builder.Build();
}
public virtual IModel Get(int id) {

View File

@@ -0,0 +1,22 @@
using System;
namespace Orchard.Models.Driver {
public class ModelBuilder {
private IModel _instance;
public ModelBuilder(string modelType) {
_instance = new ModelRoot(modelType);
}
public IModel Build() {
return _instance;
}
public ModelBuilder Weld<TPart>() where TPart : class, IModel, new() {
var part = new TPart();
part.Weld(_instance);
_instance = part;
return this;
}
}
}

View File

@@ -29,17 +29,5 @@ namespace Orchard.Models.Driver {
protected virtual void UpdateEditors(UpdateModelContext context) {
}
/// <summary>
/// TODO: move this - make a modelbuilder class or something
/// </summary>
/// <typeparam name="TPart"></typeparam>
/// <param name="context"></param>
protected void WeldModelPart<TPart>(NewModelContext context) where TPart : class,IModel,new() {
var newPart = new TPart();
newPart.Weld(context.Instance);
context.Instance = newPart;
}
}
}

View File

@@ -1,6 +1,6 @@
namespace Orchard.Models.Driver {
public class NewModelContext {
public string ModelType { get; set; }
public IModel Instance { get; set; }
public ModelBuilder Builder { get; set; }
}
}

View File

@@ -137,6 +137,7 @@
<Compile Include="Models\DefaultModelManager.cs" />
<Compile Include="Models\Driver\CreateModelContext.cs" />
<Compile Include="Models\Driver\LoadModelContext.cs" />
<Compile Include="Models\Driver\ModelBuilder.cs" />
<Compile Include="Models\Driver\ModelDriver.cs" />
<Compile Include="Models\Driver\ModelDriverWithRecord.cs" />
<Compile Include="Models\Driver\NewModelContext.cs" />