DataContext Context = new DataContext();
string connStr = "";
DataDomainSchema schema = DataDomainSchema.LoadFrom("SomeMappingFile");
schema.CreateDbSchema(connStr);
DataDomain dd = new DataDomain(schema, connStr);
using (Context.Push(ShortRunningTransactionContext.Create()))
{
Customer tt = dd.New<Customer>();
tt.Name = "TechTalk";
RootProject tt_hk = dd.New<RootProject>();
tt_hk.Name = "Housekeeping";
ChildProject tt_hk_hol = dd.New<ChildProject>();
tt_hk_hol.Name = "Holiday";
tt_hk.ChildProjects.Add(tt_hk_hol);
ChildProject tt_hk_ill = dd.New<ChildProject>();
tt_hk_ill.Name = "Illness";
tt_hk.ChildProjects.Add(tt_hk_ill);
tt.RootProjects.Add(tt_hk);
RootProject tt_g = dd.New<RootProject>();
tt_g.Name = "Genome";
ChildProject tt_g_dev = dd.New<ChildProject>();
tt_g_dev.Name = "Development";
tt_g.ChildProjects.Add(tt_g_dev);
ChildProject tt_g_mnt = dd.New<ChildProject>();
tt_g_mnt.Name = "Maintenance";
tt_g.ChildProjects.Add(tt_g_mnt);
tt.RootProjects.Add(tt_g);
Context.CommitCurrent();
}
public class BlogPost
private readonly List<string> _tags = new List<string>();
private readonly BlogUser _createdBy = new BlogUser();
public string Title { get; set; }
public string Body { get; set; }
public List<string> Tags
get { return _tags; }
public BlogUser CreatedBy
get { return _createdBy; }
public BlogUser LastEditedBy { get; set; }
public class BlogUser
public int Age { get; set; }
public string Name { get; set; }
BlogPost post = new BlogPost()
Title = "Post on Lambdas",
Body = "This is a post...",
Tags =
".Net",
"Lambda",
"C#3.0"
},
CreatedBy =
Name = "Jane Doe",
Age = 35
LastEditedBy = new BlogUser()
Name = "Joe Bloggs",
Age = 25
};
BlogPost post = evaluator.Create(() => new BlogPost()
});
public T Create<T>(Expression<Func<T>> expression)
public class ServiceInjectionEvaluator
private readonly IServiceProvider _serviceProvider;
public ServiceInjectionEvaluator(IServiceProvider serviceProvider)
_serviceProvider = serviceProvider;
switch (expression.Body.NodeType)
case ExpressionType.New:
case ExpressionType.MemberInit:
return (T)EvaluateExpression(expression.Body);
default:
return expression.Compile().Invoke();
private object GetInstanceWithInit(MemberInitExpression expression)
object instance = GetInstance(expression.NewExpression);
foreach (MemberBinding binding in expression.Bindings)
ApplyBinding(instance, binding);
return instance;
private void ApplyBinding(object instance, MemberBinding binding)
switch (binding.BindingType)
case MemberBindingType.Assignment:
ApplyAssignmentBinding(instance, (MemberAssignment)binding);
break;
case MemberBindingType.ListBinding:
ApplyListBinding(instance, (MemberListBinding)binding);
case MemberBindingType.MemberBinding:
ApplyMemberBinding(instance, (MemberMemberBinding)binding);
throw new NotImplementedException();
private void ApplyMemberBinding(object instance, MemberMemberBinding binding)
PropertyInfo property = (PropertyInfo)binding.Member;
object memberValue = property.GetValue(instance, null);
foreach (MemberBinding childBinding in binding.Bindings)
ApplyBinding(memberValue, childBinding);
private void ApplyListBinding(object instance, MemberListBinding binding)
object list = ((PropertyInfo)binding.Member).GetValue(instance, null);
foreach (ElementInit elementInit in binding.Initializers)
Delegate compiled = Expression.Lambda(Expression.NewArrayInit(typeof(object), elementInit.Arguments.ToArray())).Compile();
object[] arguments = (object[])compiled.DynamicInvoke();
elementInit.AddMethod.Invoke(list, arguments);
private void ApplyAssignmentBinding(object instance, MemberAssignment assignment)
object value = EvaluateExpression(assignment.Expression);
PropertyInfo info = (PropertyInfo)assignment.Member;
info.SetValue(instance, value, null);
private object EvaluateExpression(Expression expression)
switch (expression.NodeType)
return GetInstance((NewExpression) expression);
return GetInstanceWithInit((MemberInitExpression) expression);
return Expression.Lambda(expression).Compile().DynamicInvoke();
private object GetInstance(NewExpression expression)
return _serviceProvider.GetService(expression.Type);
public class DataDomainServiceProvider : IServiceProvider
private readonly DataDomain _domain;
private static readonly MethodInfo member = typeof(DataDomain).GetMethod("New");
public DataDomainServiceProvider(DataDomain domain)
_domain = domain;
public object GetService(Type serviceType)
return member.MakeGenericMethod(serviceType).Invoke(_domain, null);