我正在我的存储库类中重写内联SQL以改为使用存储过程(安全性要求).在过去使用Fluent NHibernate和Linq2Sql后,我发现它非常笨重且不优雅.
编辑:澄清一下,我不是在寻找适用于存储过程的ORM解决方案.我只是想要一个很好的方法来编写下面的代码.
是否有任何策略可以使这种代码尽可能优雅?
string commandText = "dbo.Save";
using (SqlConnection sql = new SqlConnection(_connString.ConnectionString))
using (SqlCommand cmd = sql.CreateCommand())
{
cmd.CommandText = commandText;
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter idParam = new SqlParameter("identity", item.Identity);
idParam.Direction = ParameterDirection.Input;
SqlParameter nameParam = new SqlParameter("name", item.Name);
nameParam.Direction = ParameterDirection.Input;
SqlParameter descParam = new SqlParameter("desc", item.Description);
descParam.Direction = ParameterDirection.Input;
SqlParameter titleParam = new SqlParameter("title", item.)
descParam.Direction = ParameterDirection.Input;
//SNIP More parameters
cmd.Parameters.Add(idParam);
cmd.Parameters.Add(descParam);
cmd.Parameters.Add(titleParam);
//SNIP etc
sql.Open();
cmd.ExecuteNonQuery();
//Get out parameters
}
return item;
Run Code Online (Sandbox Code Playgroud) 我一直想创建一个可重复使用的代码片段库一段时间,似乎永远不会对它有所了解.目前我只是倾向于有一些我从旧项目中拖出的瞬态类/文件.
我认为我的主要问题是:
从哪儿开始.我的存储库应该采用什么结构?它应该是一个编译库(在适当的地方)还是只是我可以放入任何项目的类/文件?或者可以包含的图书馆项目?这有什么许可意义?
根据我的经验,一个内置/缩小的库将很快变得过时,源将丢失.所以我倾向于源,我可以从SVN导出并包含在任何项目中.
知识产权.我受雇了,所以我写的很多代码都不是我的IP.我如何确保在工作和家庭项目中不使用自己的IP?我认为最好的方法是使用开源许可证授权我的库,并确保我只使用自己的设备在我自己的时间添加它,因此确保如果我在工作项目中使用相同的规则如同我使用第三方库一样申请.
我用许多不同的语言编写,通常需要这个库的两个或更多部分.
我应该为每个选择的可重用组件和语言实现一些模板项目和核心项目吗?
有没有其他人有这种类型的库,你如何组织和更新它?
我一直在尝试编写一个扩展方法来模仿List.RemoveAll(Predicate).
到目前为止,我有这个:
public static void RemoveAll<TKey,TValue>(this Dictionary<TKey,TValue> dict,
Predicate<KeyValuePair<TKey,TValue>> condition)
{
Dictionary<TKey,TValue> temp = new Dictionary<TKey,TValue>();
foreach (var item in dict)
{
if (!condition.Invoke(item))
temp.Add(item.Key, item.Value);
}
dict = temp;
}
Run Code Online (Sandbox Code Playgroud)
有什么指针吗?这是一个完全天真的实现吗?
<if test="${deployErrors} > 0">
<fail message="MSDeploy failed" />
</if>
Run Code Online (Sandbox Code Playgroud)
${deployErrors}
从正则表达式捕获组填充,并且具有数值或空字符串.如何在NAnt if块中检查是否大于0?如果部署错误包含'1',那么我得到的错误
'1> 0'不是属性'test'的有效值.无法将"1> 0"解析为布尔值.字符串未被识别为有效的布尔值.
我正在使用Tridion 2009 SP1.我正在尝试做的是在组件完成某个工作流程过程后启动一个事件.直觉上我尝试使用OnProcessInstanceFinishPost事件,但是,当用户(admin)显式单击"Finish Process"时,才会触发此事件; 当所有活动完成并且"到达'停止'标志结束标记(如在Visio图中)之后,该过程正常完成时,不会触发此事件.
所以我使用了OnActivityInstanceFinishPost事件.问题是在OnActivityInstanceFinishPost事件中我得到记录器并尝试记录一条简单的消息,例如"Hello World",但事件查看器总是显示错误:"TCMEventLog.NTEventLog.1中发生错误:ReportEvent失败".并且事件没有被执行.
请注意,在OnProcessInstanceFinishPost事件中,完全相同的代码可以正常工作而不会出错.
我已经检查过这是否是身份用户权限的问题,但用户是Tridion的管理员,所以这不可能.我已经检查了SDLTridionworld论坛,但没有运气,当然,我已经将代码简化为一个日志记录语句,以确保它不是我的代码中的东西.
这是代码:
public void OnActivityInstanceFinishPost(ActivityInstance ActivityInstance, string finishMessage, string nextActivity, string dynamicAssignee)
{
TDSE tdse = new TDSEClass() as TDSE;
tdse.Impersonate(_identity);
tdse.Initialize();
Logging logger = tdse.GetLogging() as Logging;
logger.LogEvent("Entered event OnActivityInstanceFinishPost. nextActivity="+nextActivity, EnumSeverity.severityInfo, EnumEventCategory.EVENT_CATEGORY_EVENT_SYSTEM);
}
Run Code Online (Sandbox Code Playgroud)
这是完整的错误:
Log Name: Tridion Content Manager
Source: Kernel
Date: 4/9/2012 10:14:07 PM
Event ID: 100
Task Category: Logging
Level: Error
Keywords: Classic
User: SYSTEM
Computer: xxxxxxxxxxxxxx
Description:
An error occured in TCMEventLog.NTEventLog.1:
ReportEvent failed.
Event Xml:
<Event …
Run Code Online (Sandbox Code Playgroud) 我已将Code Mirror作为插件实现到CMS系统中.
我有一个问题,如果我选择多行并按Tab键删除行.
这不会发生在Code Mirror演示网站上.我找不到配置选项来启用或禁用多个缩进.
这是我的配置代码:
this.CodeArea = CodeMirror.fromTextArea(codeArea, {
lineNumbers: true,
mode: { name: "xml", htmlMode: true },
onChange : function (editor) {
editor.save();
}
});
Run Code Online (Sandbox Code Playgroud)
上下文:https://github.com/rsleggett/tridion-mirror/blob/master/src/BuildingBlocks.Tridion2011Extensions.CodeMirror/BuildingBlocks.Tridion2011Extensions.CodeMirror/Scripts/codemirror/codemirror.js
我不确定我错过了什么.有任何想法吗?
基于一个相当简单的查询,我在Broker加载动态组件演示时遇到了问题,如下所示,我试图根据被特定关键字标记来加载Component:
private string GetComponentPresentations()
{
Logger.Log.Info("Entered GetComponentPresentations");
var publicationCriteria = new PublicationCriteria(_publicationId);
int schemaId = int.Parse(SchemaId.Split('-')[1]);
// Is it the correct content type (Schema)
var isSpecifedSchema = new ItemSchemaCriteria(schemaId);
// Type of the item is 16 (Component).
var isComponent = new ItemTypeCriteria(16);
// All of the above conditions must be true
Criteria isCorrectComponent = CriteriaFactory.And(isSpecifedSchema, isComponent);
var publicationAndIsComponent = CriteriaFactory.And(publicationCriteria, isCorrectComponent);
//Only get components tagged with the specified keyword
var keywordCriteria = new KeywordCriteria(_productsCategoryTcmId, ProductFilter, Criteria.Equal);
//Only get Components of …
Run Code Online (Sandbox Code Playgroud) 是否可以从TBB动态设置元数据字段的值?或者是否可以从TBB动态添加不一定存在于架构中的元数据字段?
我想这样做的原因是我使用的是DD4T,我希望将面包屑自动添加到DD4T xml中.
我尝试过以下方法:
public override void Transform(Engine engine, Package package)
{
Initialize(engine,package);
var page = GetPage();
string output = page.OrganizationalItem.Title;
var parent = page.OrganizationalItem as StructureGroup;
while (parent != null)
{
output = GetLinkToStructureGroupIndexPage(parent) + Separator + output;
parent = parent.OrganizationalItem as StructureGroup;
}
// I tried this to dynamically add the field
//var metadata = page.Metadata.OwnerDocument.CreateElement("breadcrumb");
//metadata.InnerText = output;
//page.Metadata.AppendChild(metadata);
//I tried this to dynamically set an existing field on the schema
foreach (XmlNode xml in page.Metadata)
{ …
Run Code Online (Sandbox Code Playgroud) 我试图在我的应用程序中解决UI2012的几个问题,似乎无法让我的组件在正确的上下文中可编辑.我总是要点击"在任何地方编辑此组件"或"本地化此组件"以编辑某些内容.
我的蓝图目前非常简单:
这是我的siteedit_config.xml
<?xml version="1.0" encoding="utf-8"?>
<siteEdit enabled="true" style="SiteEdit2012" tridionHostUrl="http://mycmsurl">
<contextPublications>
<contextPublication id="9" componentPublication="5" pagePublication="9" publishPublication="9" />
</contextPublications>
</siteEdit>
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我刚刚开始了一个新项目,并且自然而然地选择使用了许多新技术.
我正在使用(流畅的)NHibernate,ASP.NET MVC 3,我正在尝试应用Repository模式.
我决定将我的业务逻辑分离成一个单独的项目,并定义包装我的存储库的服务,这样我就可以返回POCO而不是NHibernate代理,并在我的前端和DA逻辑之间保持更多的分离.这也将使我能够轻松提供与API相同的逻辑(一项要求).
我选择使用通用IRepository<T>
接口,其中T
一个是我的NHibernate映射实体,它们都实现了IEntity(我的界面只是一个标记).
问题是这违背了聚合根模式,我开始感受到贫血领域模型的痛苦.
如果我改变了另一个悬挂的物体
在我的服务中,我必须做以下事情:
public void AddNewChild(ChildDto child, rootId)
{
var childEntity = Mapper.Map<ChildDto,ChildEntity>(child);
var rootEntity = _rootrepository.FindById(rootId);
rootEntity.Children.Add(childEntity);
_childRepository.SaveOrUpdate(child);
_rootRepository.SaveOrUpdate(root);
}
Run Code Online (Sandbox Code Playgroud)
如果我不先保存孩子,我会从NHibernate得到一个例外.我觉得我的通用存储库(我目前在一个服务中需要其中5个)不是正确的方法.
public Service(IRepository<ThingEntity> thingRepo, IRepository<RootEntity> rootRepo, IRepository<ChildEntity> childRepo, IRepository<CategoryEntity> catRepo, IRepository<ProductEntity> productRepo)
Run Code Online (Sandbox Code Playgroud)
我觉得不是让我的代码更灵活,而是让它变得更脆弱.如果我添加一个新表,我需要在我的所有测试中更改构造函数(我正在使用DI进行实现,所以这不是太糟糕)但它看起来有点臭.
有没有人对如何重组这种架构有任何建议?
我应该使我的存储库更具体吗?服务抽象层是否太过分了?
编辑:有一些很好的相关问题正在帮助:
c# architecture asp.net-mvc ddd-repositories repository-pattern
tridion ×4
c# ×2
dd4t ×2
architecture ×1
asp.net-mvc ×1
c#-3.0 ×1
codemirror ×1
generics ×1
if-statement ×1
javascript ×1
nant ×1
resources ×1
sql ×1
tridion2009 ×1