Jonna
Jonna

Reputation: 1645

C# POCO T4 template, generate interfaces?

Does anyone know of any tweaked version of POCO T4 template that generates interfaces along with classes? i.e. if I have Movie and Actor entities in .edmx file, I need to get the following classes and interfaces.

interface IMovie
{
    string MovieName { get; set; }
    ICollection<IActor> Actors { get; set; } //instead of ICollection<Actor>
}

class Movie : IMovie
{
    string MovieName { get; set; }
    ICollection<IActor> Actors { get; set; } //instead of ICollection<Actor>
}

interface IActor
{
    string ActorName { get; set; }
}

class Actor
{
    string ActorName { get; set; }
}

Also, just in case I write my own entities, does POCO proxies(I need them for lazy loading) work with the interface declarations as shown above?

Upvotes: 12

Views: 5019

Answers (2)

Believe2014
Believe2014

Reputation: 3964

Does anyone know of any tweaked version of POCO T4 template that generates interfaces along with classes?

There is no official support from Microsoft about generating interfaces.

There's a walk through that shows how to force Entity framework to implement an interface. http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx

Alternatively, you can download a working example of the customized T4 files to generate interfaces along with classes:

https://entityinterfacegenerator.codeplex.com/

Upvotes: 0

Scott
Scott

Reputation: 13931

You can edit the default T4 template that generates your POCO entities to also generate interfaces. I did this a while back on a project at work. This link covers the jist of how we did it. It's relatively easy.

Here's a snippet of our T4 template, might help. We inserted this code into the default T4 template that generates the POCO entities.

<#
    GenerationEnvironment.Clear();
    string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);    
    string outputPath = Path.Combine(templateDirectory + @"..\..\Models\Interfaces\Repositories\IEntitiesContext.cs");
#>

using System;
using System.Data.Objects;
using Models.DataModels;

namespace Interfaces.Repositories
{
    #pragma warning disable 1591
    public interface IEntitiesContext : IDisposable
    {
    <#
        region.Begin("ObjectSet Properties", 2);

        foreach (EntitySet entitySet in container.BaseEntitySets.OfType<EntitySet>())
        {
#>
        IObjectSet<<#=code.Escape(entitySet.ElementType)#>> <#=code.Escape(entitySet)#> { get; }
<#
        }
        region.End();

        region.Begin("Function Imports", 2);

        foreach (EdmFunction edmFunction in container.FunctionImports)
        {
            var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
            string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
            if (edmFunction.ReturnParameter == null)
            {
                continue;
            }
            string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));

#>
    ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>);
<#
        }

        region.End();
#>

        int SaveChanges();
        ObjectContextOptions ContextOptions { get; }
        System.Data.Common.DbConnection Connection { get; }
        ObjectSet<T> CreateObjectSet<T>() where T : class;
    }
    #pragma warning restore 1591
}
<#
        System.IO.File.WriteAllText(outputPath, GenerationEnvironment.ToString());
        GenerationEnvironment.Clear();
#>

Upvotes: 5

Related Questions