3

我正在使用 n 层应用程序上的自我跟踪实体。所以我有一个 WCF 服务,它为客户端提供对数据层的访问,我发现自己实现了很多与从我的模型中获取一些实体相对应的“相同”功能,例如GetOrders,在客户端中更改它们之后,aSave(Order order)Save(TrackableCollection<Orders> orders)操作以保持更改。

我想知道是否存在可以构建基本接口的 T4 模板,以及每个实体的单个和集合的 Get/Save 以及我的模型中的相应服务实现?

我知道我可以编写自己的 T4 模板来生成此服务,如果必须的话,我可能会这样做,但首先我想我会问社区是否已经在互联网的某个地方进行了这项工作,是计划好的,是其他人想要的和/或完全愚蠢的想法。

我确实找到了这个WCF 数据服务生成器示例,它在正确的轨道上。

也许更适合在 n 层解决方案中使用 WCF 的 STE?

4

1 回答 1

2

那里更多),但你总是需要定制。我已经定制了网上找到的简单模板,本质上它的作用是创建操作合同,以及为 win32 客户端提供可见性的 web 方法。下面是一段摘录:

// I obtain anykeys by iterating through the entity keys:
_anyKeys = string.Format("{0}{1} item.{2} == {3}_dto.{2}", _anyKeys, _and, key.ToString(), _double);
    // loop through all the entities:
    foreach (EntityType entity in Item1Collection.GetItems<EntityType>().OrderBy(e => e.Name))
    {

    /// <summary>
    /// <#=code.Escape(entity)#> Operation contracts - <#=code.Escape(entityName)#> 
    /// </summary>  
    [WebMethod]
    public bool Save<#=code.Escape(entity)#>(Dto<#=code.Escape(entity)#> _dto, int racID, string profile)
    {
        try
        {
            // Load the db
            using (<#=ContextName#> db = new <#=ContextName#>(EFUtils.GetEFConnectionString(profile, modelName)))
            {
                // Check if item exists         
                var exists = db.<#=code.Escape(entityName)#>.Any(item=> <#=code.Escape(_anyKeys)#>);
                // convert to entity
                var _entity = _dto.ToEntity();
                if(exists)
                {
                  // Attach the entity to the db
                  db.<#=code.Escape(entityName)#>.Attach(_entity);
                  // Change tracking
                  ChangeTracking<<#=code.Escape(entity)#>>(_dto.ModifiedProperties, db, _entity);
                }
                else
                {
                  // New entity
                  db.<#=code.Escape(entityName)#>.Add(_entity);
                }
                // Save changes
                return db.SaveChanges() > 0;
            }
        }
        catch(Exception ex)
        {               
            Global.LogMessageToFile(ex, string.Format("{0} - profile {1}, Save<#=code.Escape(entity)#>", racID, profile));
        }
        finally
        {       
        }
        return false;
    }


// Then the interfaces
#>
#region <#=code.Escape(entity)#>
    /// <summary>
    /// <#=code.Escape(entity)#> Operation contracts - <#=code.Escape(entity.Name)#> 
    /// </summary>  
    [OperationContract]
    bool Save<#=code.Escape(entity)#>(Dto<#=code.Escape(entity)#> _dto, int racID, string profile);
    [OperationContract]
    bool Delete<#=code.Escape(entity)#>(<#=code.Escape(_keys)#>, int racID, string profile);
    [OperationContract]
    Dto<#=code.Escape(entity)#> Get<#=code.Escape(entity)#>(<#=code.Escape(_keys)#>, string  filterXml, int racID, string profile);
    [OperationContract]
    List<Dto<#=code.Escape(entity)#>> List<#=code.Escape(entityName)#>(string  filterXml, int racID, string profile);   
#endregion
<#+ 
于 2012-10-11T08:46:30.517 回答