1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.Web.DynamicData.ModelProviders;
using MonoTests.DataSource;
using MonoTests.Common;
namespace MonoTests.ModelProviders
{
public class DynamicDataContainerModelProvider <TContext> : DataModelProvider
{
IDynamicDataContainer <TContext> container;
Type containerType;
ReadOnlyCollection<TableProvider> tables;
public IDynamicDataContainer <TContext> Container
{
get
{
if (container != null)
return container;
container = Activator.CreateInstance (containerType) as IDynamicDataContainer <TContext>;
if (container == null)
throw new InvalidOperationException ("Failed to create an instance of container type '" + ContextType + "'.");
return container;
}
}
public override Type ContextType
{
get
{
return typeof (TContext);
}
protected set
{
throw new InvalidOperationException ("Setting the context type on this provider is not supported.");
}
}
public DynamicDataContainerModelProvider ()
{
Type genType = typeof (TestDataContainer<>).GetGenericTypeDefinition ();
this.containerType = genType.MakeGenericType (new Type[] { ContextType });
}
public DynamicDataContainerModelProvider (IDynamicDataContainer <TContext> container)
{
if (container == null)
throw new ArgumentNullException ("container");
this.container = container;
}
public override object CreateContext ()
{
return Activator.CreateInstance (ContextType);
}
public override ReadOnlyCollection<TableProvider> Tables
{
get
{
if (tables != null)
return tables;
tables = LoadTables ();
return tables;
}
}
public void ResolveAssociations ()
{
foreach (var t in Tables) {
var table = t as DynamicDataContainerTableProvider <TContext>;
if (t == null)
continue;
table.ResolveAssociations ();
}
}
ReadOnlyCollection<TableProvider> LoadTables ()
{
List<DynamicDataTable> containerTables = Container.GetTables ();
if (containerTables == null || containerTables.Count == 0)
return new ReadOnlyCollection<TableProvider> (new List<TableProvider> ());
var tables = new List<TableProvider> ();
foreach (var table in containerTables)
tables.Add (new DynamicDataContainerTableProvider <TContext>(this, table));
return new ReadOnlyCollection<TableProvider> (tables);
}
}
}
|