2011-04-09 110 views
1

如果我有这样的通过wcf创建对象时隐藏id属性?

public void AddUser(User user) 
{ 
     user.Id = Guid.NewGuid(); 
     _userList.Add(user); 
} 

和用户类简单的add方法一样

[DataContract] 
public class User 
{ 

    [DataMember] 
    public Guid Id { get; set; } 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public DateTime DateCreated { get; set; }   
} 

是否有可能隐藏用户ID添加新对象时。 我知道我可以通过参数化输入法(发送每个对象属性作为输入参数)来实现这一点,但我不认为这符合wcf模型。如果我有很多属性呢?这只是一个简单的例子。


wcf test client screen

回答

0

希望我的意见让你的感觉,或者你的开发范围。

好吧,我认为你的guid应该在你的add方法中生成,而不是在对象属性中传递。我给这个方法提供了判断生成的GUID是否有效的可能性,你可以尝试新的GUID,直到你得到一个有效的GUID。

我不知道是否有可能隐藏在这个工具中,因为你已经标记为DataMember的ID,这意味着你的财产变得availabe。

如果先前的消解对您有意义,请在此方法中忘记此值。如果不是我能看到的唯一解决方案是创建一个没有此成员的新类。

希望它可以帮助你

+0

我在里面创建Guid添加方法。问题在于它通过User.Id属性暴露给wcf客户端。 Wcf客户端可以看到整个用户对象广告方法参数。 – nemke 2011-04-09 09:51:24

+0

你可以通过另一种方式改变你的add方法,而不是传递一个类,在add方法上创建多个参数。只有当你必须传递很多参数时,问题才会变成!!,因为你的例子使得我可以舒适地将更多的参数传递给这个方法!并解决问题! – 2011-04-09 10:03:31

0

如果你删除[数据成员]属性,那么GUID将无法使用WCF,因为它不会被序列化。 但是,如果在服务的任一侧使用用户对象(如果它们绑定到后端数据库),是否会出现问题?你不会一直在创建新的用户对象吗?

1

是否可以在添加新对象时隐藏用户标识。我知道我可以通过参数化输入方法(发送每个对象属性作为输入参数)来实现这一点,但我不认为这符合wcf模型。

除了使用相同DTO或甚至一个实体对象本身为服务Get方法和Add方法的,最好是具有

单独UserResult DTO为GetUser方法:

public class UserResult 
    public ID as Guid 
    public FirstName as String 
    public LastName as String 
    public DateCreated as DateTime 
end class 

public class UserService 
    public function GetUser(ID as Guid) as UserResult 
end class 

和另外的UserAddCommand DTO对于AddUser方法:

public class UserAddCommand 
    public FirstName as String 
    public LastName as String 
end class 

public class UserService 
    public function AddUser(Command as UserAddCommand) as Response 
end class 

用户的ID乃至DateCreated都是在服务端创建的,服务方式为AddUser

+0

你刚刚回答了一个五年的问题吗? :P – CodeCaster 2016-01-09 13:27:05