Шаблон C # POCO T4, генерировать интерфейсы? - PullRequest
12 голосов
/ 29 декабря 2010

Кто-нибудь знает какую-либо подправленную версию шаблона 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 (они мне нужны для отложенной загрузки) работают с объявлениями интерфейса, как показано выше?

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

Вы можете редактировать шаблон 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();
#>
0 голосов
/ 25 апреля 2014

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

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

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

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

https://entityinterfacegenerator.codeplex.com/

...