2010-12-28 68 views
11

Có ai biết về bất kỳ phiên bản được chỉnh sửa nào của mẫu POCO T4 có tạo giao diện cùng với các lớp không? tức là nếu tôi có các đối tượng Phim và diễn viên trong tệp .edmx, tôi cần có các lớp và giao diện sau.Mẫu C# POCO T4, tạo giao diện?

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

Ngoài ra, chỉ trong trường hợp tôi viết các thực thể của riêng mình, POCO proxy có cần làm việc với các khai báo giao diện như minh họa ở trên không?

+0

Jonna, tôi sẽ quan tâm nhiều nhất để nghe nếu bạn đã thành công với cách tiếp cận của bạn trong khi điều chỉnh mã trong câu trả lời dưới đây để tạo giao diện POCO +. Chúng tôi đang xem xét việc sử dụng các giao diện theo cùng một cách và chưa tìm ra cách để thực hiện nó. Trân trọng, Timo –

Trả lời

4

Bạn có thể chỉnh sửa mẫu T4 mặc định để tạo các thực thể POCO của bạn cũng tạo các giao diện. Tôi đã làm điều này một thời gian trở lại trên một dự án tại nơi làm việc. This link bao gồm các jist của cách chúng tôi đã làm nó. Nó tương đối dễ dàng.

Đây là đoạn trích mẫu T4 của chúng tôi, có thể hữu ích. Chúng tôi đã chèn mã này vào mẫu T4 mặc định để tạo các thực thể 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

T4 này sẽ tạo ra một giao diện cho bối cảnh, nhưng nó không xuất hiện để tạo ra giao diện cho các thực thể thực tế (IMovie, IActor, vv), phải không? –

+0

bạn có thể tải xuống ví dụ hoạt động về các tệp T4 tùy chỉnh để tạo giao diện cùng với các lớp: https://entityinterfacegenerator.codeplex.com/ – Believe2014

0

Có ai biết về bất kỳ phiên bản tinh chỉnh của poco T4 mẫu mà tạo ra các giao diện cùng với lớp học?

Không có sự hỗ trợ chính thức nào của Microsoft về việc tạo giao diện.

Có một hướng dẫn cho thấy cách ép buộc khung thực thể triển khai giao diện. http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx

Ngoài ra, bạn có thể tải về một ví dụ làm việc của các tập tin T4 tùy chỉnh để tạo ra các giao diện cùng với các lớp:

https://entityinterfacegenerator.codeplex.com/