我正在尝试遵循最佳的多层设计实践,并且不希望我的MVC控制器与我的DAL(或任何IRepository)进行交互.它必须通过我的业务服务层来执行适当的业务规则和验证.验证 - 我不想在我的域模型实体上使用各种验证属性(例如[必需])在控制器中执行验证,因为这揭示了我的前端.更不用说这项服务也可以通过WPF前端实现.
由于我的验证是在我的服务层完成的,将值返回给UI的最佳做法是什么?我不想要'void addWhatever(int somethingsID)',因为我需要知道它是否失败了.它应该是一个布尔值吗?应该是Enum吗?我应该利用异常处理吗?或者,在将验证属性装饰到Model对象时,是否应该返回一些类似于MVC使用的IValidationDictionary对象?(如果需要,我可以在UI中使用适配器模式)
我想将我的实体从控制器传递到服务层,并了解验证/数据持久性是否失败.我也不想忽视这样一个事实,即我需要返回一个视图,指出可能验证失败的每个字段的正确错误消息(我希望尽可能保持无痛).
我有几个想法,所有这些想法都不对.我觉得答案包括特定于视图的模型实体,但这会导致必须处理的整个映射问题,更不用说这违反了DRY(不要重复自己)原则.什么是最佳做法?
c# validation model-view-controller asp.net-mvc asp.net-mvc-3
我们正在创建一个必须在租户之间隔离数据的多租户应用程序.每个租户将保存各种文档,每个文档可以分为几个不同的文档类别.我们计划对这些文档使用Azure blob存储.但是,考虑到我们的用户群以及每个文档的文档数量和大小,我们不确定如何使用当前的Azure订阅来最好地管理存储帐户.
以下是一些需要考虑的数字.拥有5,000名用户,每位用户每年27,000个8Mb文档,即每年1080TB.每个存储帐户的存储容器最大为500TB.
所以我的问题是什么是最有效和最具成本效益的方式来存储这些数据并保持在Azure限制内?
以下是我们考虑过的一些事情:
为每个客户创建一个存储帐户.这不起作用,因为每个订阅只能有100个存储帐户(这可能是最理想的解决方案).
为每个客户端创建一个blob容器.存储帐户最多可以有500TB,因此除非最终我们必须拆分为其他存储帐户,否则这可能会有效.如果用户最终在两个帐户中拥有数据,我不确定这是如何工作的.可能会变得凌乱.
也许我们在这里遗漏了一些根本简单的东西.
更新 目前我们的想法是使用Azure表存储,每个文档类型都有一个表.在每个表中,分区键是租户的ID,行键是文档ID.每行还包含文档的元数据类型信息,以及链接到blob本身的URI(或其他内容).
在 Azure 表存储中,如何查询与分区中特定行键匹配的一组实体???
我正在使用 Azure 表存储,需要检索一组与分区内的一组行键匹配的实体。
基本上,如果这是 SQL,它可能看起来像这样:
SELECT TOP 1 SomeKey
FROM TableName WHERE SomeKey IN (1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
我想节省成本并减少做一堆表检索操作,我可以使用表批处理操作来完成。出于某种原因,我得到一个例外,说:
“具有检索操作的批处理事务不能包含任何其他操作”
这是我的代码:
public async Task<IList<GalleryPhoto>> GetDomainEntitiesAsync(int someId, IList<Guid> entityIds)
{
try
{
var client = _storageAccount.CreateCloudTableClient();
var table = client.GetTableReference("SomeTable");
var batchOperation = new TableBatchOperation();
var counter = 0;
var myDomainEntities = new List<MyDomainEntity>();
foreach (var id in entityIds)
{
if (counter < 100)
{
batchOperation.Add(TableOperation.Retrieve<MyDomainEntityTableEntity>(someId.ToString(CultureInfo.InvariantCulture), id.ToString()));
++counter;
}
else
{
var batchResults = await table.ExecuteBatchAsync(batchOperation);
var …Run Code Online (Sandbox Code Playgroud) 我正在使用我在网上找到的一些代码,这是解决其他人类似打印问题的方法。代码似乎运行良好,甚至在我期望的时候出错(例如,当我故意输入错误的打印机名称时)。我遇到的问题是对 winspool.drv 的 WritePrinter 方法的互操作调用似乎不会导致打印机打印任何内容,即使此方法返回“true”。任何想法为什么打印机实际上没有打印???
public class PrintRaw
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOC_INFO_1
{
[MarshalAs(UnmanagedType.LPStr)]
public string pDocName;
[MarshalAs(UnmanagedType.LPStr)]
public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)]
public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter,
IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = …Run Code Online (Sandbox Code Playgroud)