С# POCO T4 шаблон, генерировать интерфейсы?

Кто-нибудь знает какую-либо измененную версию шаблона POCO T4, которая создает интерфейсы вместе с классами? т.е. если у меня есть объекты Movie и Actor в .edmx файле, мне нужно получить следующие классы и интерфейсы.

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; }
}

Кроме того, на всякий случай, когда я пишу свои собственные сущности, прокси-серверы POCO (мне они нужны для ленивой загрузки) работают с объявлениями интерфейса, как показано выше?

Ответ 1

Вы можете отредактировать шаблон T4 по умолчанию, который генерирует ваши объекты POCO для генерации интерфейсов. Я сделал это некоторое время назад на проекте на работе. Эта ссылка раскрывает смысл того, как мы это сделали. Это относительно легко.

Здесь может помочь фрагмент нашего шаблона T4. Мы ввели этот код в шаблон T4 по умолчанию, который генерирует объекты POCO.

<#
    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();
#>

Ответ 2

Кто-нибудь знает какую-либо измененную версию шаблона POCO T4, которая создает интерфейсы вместе с классами?

Официальная поддержка Microsoft от создания интерфейсов отсутствует.

Прогулка через это показывает, как заставить инфраструктуру Entity реализовать интерфейс. http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx

В качестве альтернативы вы можете загрузить рабочий пример настраиваемых файлов T4 для создания интерфейсов вместе с классами:

https://entityinterfacegenerator.codeplex.com/