这听起来像是隔离应用程序层的绝佳机会。您应该做的是创建特定于 WCF 层的对象,这些对象仅充当外部消费者的数据传输对象 (DTO)。
因此,在您的 WCF 服务层中,您将对检索用户对象的数据访问层(实体框架)进行调用,并且您应该返回仅使用您想要公开的内容构建的消费者对象。
如果您这样做,您可以明确控制您对外界可见的内容,还可以从数据存储的角度隐藏有关您正在执行的操作的任何实现细节。
作为一个非常粗略的例子,在你的实体框架层你可能有这个对象:
namespace ACME.DataAccessLayer.Entities
{
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Hash { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
namespace ACME.DataAccessLayer.Services
{
using ACME.DataAccessLayer.Entities;
public class UserService
{
public User GetUser(int id)
{
using (ACMEDataContext dc = new ACMEDataContext())
{
// psuedo code to return your user with Entity Framework
return dc.Users.FirstOrDefault(user => user.Id == id);
}
}
}
}
然后在您的 WCF 中,您可能会有如下实体:
namespace ACME.Services.DataTransferObjects
{
[DataContract]
public class User
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
}
}
Then you would expose a service endpoint that would return back the DTO as such:
namespace ACME.Services
{
using ACME.DataAccessLayer.Services;
public class PublicWCFService : IUserService
{
public ACME.Services.DataTransferObjects.User GetUser(int userId)
{
ACME.DataAccessLayer.Entities.User entityFrameowrkUser = new UserService().GetUser(userId);
return new ACME.Services.DataTransferObjects.User
{
Id = entityFrameowrkUser.Id,
FirstName = entityFrameowrkUser.FirstName,
LastName = entityFrameowrkUser.LastName
};
}
}
}
现在您要做的只是返回 DTO 对象,该对象不具有您在系统中使用的真实实体中可能拥有的任何属性或方法。
使用这种方法,您可以安全地将应用程序的层分解为可以轻松共享和扩展的不同层 (DLL)。
这是一个简单的示例,如果有任何进一步的内容可以使这个示例更加清晰,请告诉我。