gpt4 book ai didi

asp.net-mvc - 在使用 AppFabric 缓存的 MVC SessionState 中使用 WCF DataContract

转载 作者:行者123 更新时间:2023-12-03 20:44:01 25 4
gpt4 key购买 nike

我有一个数据访问层、一个服务层和一个表示层。表示层是 ASP.NET MVC2 RTM(Web),服务层是 WCF(服务)。这都是 .NET 3.5 SP1。

问题是在服务中,返回的对象被标记为 [DataContract]。属性。 Web 使用 AppFabric 缓存(又名 Velocity)SessionStateProvider 来存储 session 状态。因此,我存储在 session 中的任何内容都必须是可序列化的。

问题来了:DataContracts 没有用 [Serializable] 标记。据我所知,通过将它引入已经标记为 [DataContract] 的类中出现了一些问题,所以我不认为这是一个解决方案。

我最初计划在 Web 层中使用 DataContracts,将它们用作与渲染 DataContracts 相关的 View 的模型(可能嵌套在更高级别的 ViewModel 类中)。但是由于 session 状态提供程序要求存储在其中的所有对象都是可序列化的,我开始重新考虑这种策略。不过最好有,因为它们包含使用 IDataErrorInfo 的验证逻辑。接口(interface),并且相同的验证逻辑可以在 MVC 中作为模型绑定(bind)的一部分重用。

您认为让我减少所需工作的最佳方法是什么?

我目前想到了以下不同的方法:

A. 在 Web 项目中创建一个“ServiceIntegration”部件。

这将是我的 Controller 和我的 WCF 服务层之间的中间人。 ServiceIntegration 部分将使用 DataContracts 与服务层通信,并使用 ViewModels 与 Web 层通信,但必须使用双向 Transformer 在 DataContracts 和 ViewModels 之间进行转换。

此外,由于 IDataErrorInfo 验证不可重用,因此也有必要为每个 DataContract 创建一个验证器,它使用 Transformer 从 ViewModel 转换为 DataContract,使用 IDataErrorInfo 执行验证并返回其结果。然后将在 Controller 的操作方法中使用它(例如 if (!MyValidator.IsValid(viewModel)) return View(); )

需要不同的类:xDataContract、xViewModel、xTransformer、xValidator

B. 在 Web 项目 中创建一个“SessionIntegration”部分

这将是 Controller (或访问 session 的任何东西)和 session 本身之间的中间人。任何需要访问 session 的东西都将通过这个类。 DataContracts 将在整个应用程序中使用,除非它们被存储到 session 中。 SessionIntegration 部分负责将 DataContract 转换为某种 ISerializable 形式并返回。由于在 DataContract 上使用了 IDataErrorInfo 接口(interface),因此不需要额外的验证器。

需要不同的类:xDataContract、xTransformer、xSerializableForm

注意:在这两种情况下仍然会有 ViewModels,但是使用 (B) 我可以从 DataContracts 组合 ViewModels。

(B) 的好处是不需要额外的验证器。

在我开始全面实现 (A)/(B) 之前,我想要一些反馈。目前,我开始倾向于(B),但是,(A)可能更灵活。无论哪种方式,对于它的值(value)来说,这似乎是太多的工作。有没有其他人遇到过这个问题,你同意/不同意我的观点,和/或你有其他解决问题的方法吗?

谢谢,

詹姆士

最佳答案

如果不走 A 或 B 的完整路线,您是否可以制作一个通用的 ISerializable 包装对象并将它们放入您的 SessionState 中?

    [Serializable]
public class Wrapper : ISerializable
{
public object Value { get; set; }

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
if (Value != null)
{
info.AddValue("IsNull", false);
if (Value.GetType().GetCustomAttributes(typeof(DataContractAttribute), false).Length == 1)
{
using (var ms = new MemoryStream())
{
var serializer = new DataContractSerializer(Value.GetType());
serializer.WriteObject(ms, Value);
info.AddValue("Bytes", ms.ToArray());
info.AddValue("IsDataContract", true);
}
}
else if (Value.GetType().IsSerializable)
{
info.AddValue("Value", Value);
info.AddValue("IsDataContract", false);
}
info.AddValue("Type", Value.GetType());
}
else
{
info.AddValue("IsNull", true);
}
}

public Wrapper(SerializationInfo info, StreamingContext context)
{
if (!info.GetBoolean("IsNull"))
{
var type = info.GetValue("Type", typeof(Type)) as Type;

if (info.GetBoolean("IsDataContract"))
{
using (var ms = new MemoryStream(info.GetValue("Bytes", typeof(byte[])) as byte[]))
{
var serializer = new DataContractSerializer(type);
Value = serializer.ReadObject(ms);
}
}
else
{
Value = info.GetValue("Value", type);
}
}
}
}

关于asp.net-mvc - 在使用 AppFabric 缓存的 MVC SessionState 中使用 WCF DataContract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com