我有一个存储库类,它定义了一些基本的Get/Save/Delete方法.在这些内部,我使用NHibernate来完成我的业务实体的工作.例如:
Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository
Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser
Dim eUser As Entities.User
Using session As ISession = NHibernateHelper.OpenSession()
eUser = session.Get(Of Entities.User)(UUID)
End Using
Return eUser
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
但是,在我的User类中,我有一些属性和其他对象的集合,理想情况下我想要延迟加载.但是当然,ISession是在存储库中创建和处理的,我想这就是为什么,除此之外,当我尝试访问这些属性时,我得到一个"无法初始化代理 - 没有会话"错误.
我唯一的选择是在使用存储库时禁用延迟加载吗?或者是否可能(或者只是愚蠢)以某种方式将会话纳入业务层的范围?
我确实喜欢这个存储库模型,并且NHibernate在我身上不断增长(在经历了许多最初的挫折之后试图让它工作),那么大师们一起使用它们的最佳方式是什么?
我对NHibernate和存储库模型一般都很陌生(在工作中我们仍然主要使用VB6!),所以原谅可能是一个愚蠢的问题.谢谢.
@mookid:谢谢老兄,这真的很有帮助,但我可能会把它打开一段时间.它是WCF Web服务的后端,所有功能都是每个呼叫的上下文,因此每个呼叫的会话寿命都会很好.只是不确定如何在业务层中使用这样的东西,理想情况下我不希望业务对象必须直接与任何NHibernate类接口.我猜NHibernate会话的某种包装器至少将它抽象出来......嗯,你至少让我走上了正确的轨道.
看起来这里的关键词是"工作单元",网上存在大量与NHibernate相关的资源.特别是寻找Ayende在Rhino Commons中的实现,以及他的App Architecture网络演员(Hibernating Rhinos的第9号),非常有用.我最初感到困惑,因为我虽然在业务层中设置了"工作单元",但是我很快就纠正了.
在Windows中,在Git Bash中,如果我执行git diff,我会将所有差异刷新到控制台,并提供某种控制输出缓冲区的提示.在这种Git Bash模式下我可以使用哪些命令?我不知道在哪里寻找快速参考.
我已经解决了<Enter>将滚动一行,<Space>并将滚动所有行,但没有更多.要退出我做一个Ctrl-C,它似乎回到命令提示符,但有时当我开始键入一个新命令时,它似乎回到未完成的diff输出,我很困惑为什么.
我知道,真是愚蠢的问题.
您可以针对XML文档验证XPath表达式以验证它,但是有一种简单的方法可以针对该文档的模式验证相同的XPath表达式吗?
假设我有一个像这样的XSD架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc>
<xsd:element name="RootData">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstChild">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstGrandChild">
... etc etc
Run Code Online (Sandbox Code Playgroud)
是否有一种简单或内置的方法来验证XPath:
/RootData/FirstChild/FirstGrandChild
Run Code Online (Sandbox Code Playgroud)
对任何可能基于该模式的XML文档有效吗?(编辑:我想我的意思是可能有效 ; 实际的 XML文档可能不包含这些元素,但XPath仍然可能被认为对模式有效.但是,/RootData/ClearlyInvalidChild/ThisElementDoesntExistEither显然无效.)
当然,我只能期望这对规范的XPath表达式而不是任意复杂性的表达式起作用,但这很好.
我特别想在.NET中,但我很好奇其他实现是否可行.我想要自己动手并不是那么重要,例如我真的不想编写自己的代码来将XPath表达式转换为另一个,如:
/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
Run Code Online (Sandbox Code Playgroud)
......虽然我知道如果我真的不得不这样做的话.
干杯!
我注意到Project 2007具有允许可以撤消的操作放在单个堆栈项中的功能,或"撤消事务".例如:
Application.OpenUndoTransaction "Create 6 tasks"
Dim i As Integer
For i = 1 To 6
ActiveProject.Tasks.Add "UndoMe " & i
Next
Application.CloseUndoTransaction
Run Code Online (Sandbox Code Playgroud)
这意味着用户可以在单个撤消操作中撤消所有操作,而不是6次.
这在Word和/或Excel中实现会很棒,因为我在VSTO中做了一些可以同时进行多项更改的东西,如果用户必须多次点击撤消,这对用户来说会有点烦人.他们犯了一个错误.虽然这些特定功能似乎不存在,但是有人知道是否/如何以某种方式完成这项工作?
我有一个带有安全类的WCF服务,用于获取调用用户的一些属性.然而,当涉及到线程安全时,我非常糟糕 - 到目前为止,我并不需要对它做太多的事情,而只是对多线程问题有一个基本的理论上的理解.
鉴于以下功能:
public class SecurityService
{
public static Guid GetCurrentUserID()
{
if (Thread.CurrentPrincipal is MyCustomPrincipal)
{
MyCustomIdentity identity = null;
MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal;
if (principal != null)
{
identity = (MyCustomIdentity)principal.Identity;
}
if (identity != null)
{
return identity.UUID;
}
}
return Guid.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)
如果从2个不同的线程同时调用该方法,是否有可能出现问题?在我的噩梦中,如果这些方法出错,我会看到可怕的后果,例如有人意外地获取其他人的数据或突然变成系统管理员.一位同事(他也不是专家,但他比我好)认为它可能没问题,因为那里没有真正的共享资源.
或者这个将访问数据库的人 - 这可能会出错吗?
public static User GetCurrentUser()
{
var uuid = GetCurrentUserID();
if (uuid != null)
{
var rUser = new UserRepository();
return rUser.GetByID(uuid);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
关于线程的原理有很多讨论,但是当涉及到实际应用它时,我倾向于陷入困境并且知道何时应用它.任何帮助赞赏.
如果不清楚,我可以更详细地解释这些功能的背景/目的.
编辑: …
我正在运行一个WCF服务,除其他外,它用作网站的后端.因为网站和WCF服务都在同一台机器上运行,并且为了性能,我使用netTcpBinding进行设置.
现在的问题是,因为它们存在于同一个盒子里,所以我真的不关心传输级安全性或消息级加密; 消息被截获的唯一可能方式是,如果有人进入Web服务器本身,如果他们这样做,我已经遇到了更大的问题.
所以我的问题是:当客户端和服务器已经在受信任的子系统上时,可以使用什么配置来确保netTcpBinding尽可能快?
当然答案可能是使用"无"的安全性.但在我的特定情况下,我仍然需要对自定义数据库使用UserName身份验证.是否可以配置它以便仍然使用UserName身份验证,但不打扰证书或保护端点之间的数据?或者我是否需要使用自定义SOAP标头实现自定义行为来存储用户名/密码,然后我真的可以将安全性设置为"none"?
服务器配置
<netTcpBinding>
<binding name="Net_Tcp_Binding">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</netTcpBinding>
Run Code Online (Sandbox Code Playgroud)
它使用自定义UserName身份验证 - 基本上每个调用都会对自定义数据库进行身份验证和授权.服务方还使用证书与其客户进行协商,例如:
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceAuthorization principalPermissionMode="Custom">
<authorizationPolicies>
<add policyType="MyAssembly.CustomAuthorizationPolicy,MyAssembly" />
</authorizationPolicies>
</serviceAuthorization>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyAssembly.CustomCredentialValidator,MyAssembly" />
<serviceCertificate x509FindType="FindBySubjectName" findValue="CN=servercert" storeLocation="LocalMachine" storeName="My" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)
客户端配置
<netTcpBinding>
<binding name="Net_Tcp_Endpoint">
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</netTcpBinding>
Run Code Online (Sandbox Code Playgroud) 我们使用.settings文件来存储我们的应用程序设置,并在那里使用默认值,这样我们就不需要配置每个设置了.这一般都很好.
但是,在开发过程中我们会经常更改app.config中的值,这意味着当我们打开.settings文件时,我们总是会在app.config文件中更改"设置'x'的值."你想要吗?更新.settings文件中的值?"

在我们的例子中,正确的做法是始终单击否,否则开发设置可以相对容易地进入测试和生产环境.但是,既然我们是人类,那并不总是会发生什么.更糟糕的是,默认按钮为"是".
我们可以在某种程度上删除人类元素并使Visual Studio不要问我们这个吗?或者我们是否应该放弃依赖默认设置并在app.config中为每个单一环境中的每个设置定义一个显式条目?
settings configuration app-config web-config visual-studio-2008
在小号#ARP架构似乎真的很酷,但你认为它仍然太新作中的一个重要的新项目的承诺呢?(我们假设该项目乍一看似乎非常适合它.)
这一切都似乎很不错,我只是担心,新的项目我的工作是使用所有的新技术- WCF,ASP.NET MVC等等-而如果我多加一个婴儿技术,我将结束很多问题,没有足够的技术技能或社区支持来解决它们......
我内心那个要求很高的男孩真是太难了:我想拥有最新的东西!
(声明:我是很新的S#的arp架构,所以我主要是立足于项目的既定目标我对它的乐观态度,文章,示例代码等位)
我可以理解void**在记忆中看起来如何,但我想知道我是否正确使用它.我在下面描述的是否有任何根本缺陷?例如,虽然我可以说"它对我有用",但我是否以某种方式创建了错误/不可移植的代码?
所以我有一个小行星克隆.有三个实体可以发射子弹,即玩家(SHIP *player_1,SHIP *player_2)和UFO(UFO *ufo).当子弹被射击时,重要的是要知道谁射了子弹; 如果它是一名球员,当它击中某些东西时,他们的分数需要增加.因此,子弹将存储它所属的实体类型(owner_type)以及直接指向所有者(owner)的指针:
enum ShipType
{
SHIP_PLAYER,
SHIP_UFO
};
typedef struct Bullet
{
// ...other properties
enum ShipType owner_type;
void **owner;
} BULLET;
Run Code Online (Sandbox Code Playgroud)
然后,当玩家点击按钮或UFO看到目标时,将调用以下功能之一:
void ship_fire(SHIP **shipp)
{
BULLET *bullet = calloc(1, sizeof(BULLET));
bullet->owner_type = SHIP_PLAYER;
bullet->owner = (void**)shipp;
// do other things
}
void ufo_fire(UFO **ufop)
{
BULLET *bullet = calloc(1, sizeof(BULLET));
bullet->owner_type = SHIP_UFO;
bullet->owner = (void**)ufop;
// do other things
}
Run Code Online (Sandbox Code Playgroud)
......他们可能被称为,例如,像这样: …
我知道在触发器中 - 至少对于SQL Server - 应该永远不要假设该inserted表只有一行,这意味着触发器中的SQL通常是坏的:
select @UserID = ID from inserted
Run Code Online (Sandbox Code Playgroud)
但出于好奇,一组INSERT语句是否会导致一个inserted多行的表?我知道使用UPDATE很容易,但从我的测试中我无法模拟INSERT的类似结果.我已经尝试在发送批处理终结符之前发送多组插入,例如:
insert into TriggerTest (col2) select 'a'
insert into TriggerTest (col2) select 'b'
insert into TriggerTest (col2) select 'c'
go
Run Code Online (Sandbox Code Playgroud)
并将它们包装在交易中:
begin tran
insert into TriggerTest (col2) select 'a'
insert into TriggerTest (col2) select 'b'
insert into TriggerTest (col2) select 'c'
commit
Run Code Online (Sandbox Code Playgroud)
但它总是会导致触发器使用inserted1行表格触发3次,而从不使用inserted3行表格触发.
这对我来说是完全有意义的(毕竟它们是3个单独的语句),我不需要实际执行它,我只是想知道单独的INSERTS是否会对此行为不同.
编辑:这是一个愚蠢的问题:当然,插入结果集时可以!
insert into TriggerTest (col2) select 'a' union select 'b'
Run Code Online (Sandbox Code Playgroud)
......或任何其他类型的集合.
原谅我,这里差不多凌晨3点.我会把这个问题留给那些应该知道更好的人.
如何找出从某些.NET函数返回的COM对象的属性和方法,这些函数似乎没有记录?
在我正在看的特定示例中,我使用以下函数将图片插入Excel:
Set NewPic = ActiveSheet.Pictures.Insert(FileName)
Run Code Online (Sandbox Code Playgroud)
(请参阅此处的SO帖子.)
但是,此函数的MSDN文档仅表示Worksheet.Pictures返回一个Object,当我在调试期间对变量进行监视时,其类型为System .__ ComObject.我可以找出该类可用的其他属性和功能(例如,我想修改图片的替代文本)吗?发现这个Insert功能的人怎么会知道呢?
MSDN文档也倾向于说这些函数"它们不打算直接从你的代码中使用",但是现在让我们忽略它...
谢谢!
编辑:嗯,我设法至少回答了我的具体问题.Worksheet.Pictures.Insert您可以使用Worksheet.Shapes.AddPicture返回正确(记录)的Excel.Shape类而不是使用它:
pic = range.Worksheet.Shapes.AddPicture(tmpFile, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, range.Left, range.Top, image.Width, image.Height)
pic.AlternativeText = "Help!"
Run Code Online (Sandbox Code Playgroud)
尽管如此,仍然会对任何未记录的函数资源感兴趣.
简单XLink到同一文档中另一个节点的一般要点似乎是:
<root xmlns:xlink="http://www.w3.org/1999/xlink">
<firstChild id="ID1" />
...
<ref xlink:href="#ID1" />
</root>
Run Code Online (Sandbox Code Playgroud)
不使用XPointer或XPath,这与XLink一样多吗?你能不能做一个XLink,比如说是一个customId看起来像的东西:
<root xmlns:xlink="http://www.w3.org/1999/xlink">
<firstChild id="ID1" customId="{1234-5678}" />
...
<ref xlink:href="#customId/{1234-5678}" />
</root>
Run Code Online (Sandbox Code Playgroud)
请不要仅仅参考我的W3规范 - 我不了解你,但需要一个特殊的人来解释它们,我今天不是那个人!
无论如何,据我所知,大多数XLink似乎都是关于引用外部资源,而且我见过的大多数例子都使用http链接到网络资源......我只是好奇你可以用XLink做什么来引用XML文档中的特定部分.
谢谢!
.net ×5
vsto ×2
wcf ×2
xml ×2
xpath ×2
app-config ×1
architecture ×1
bash ×1
c ×1
c# ×1
com ×1
excel ×1
frameworks ×1
git ×1
insert ×1
ms-word ×1
nhibernate ×1
repository ×1
security ×1
settings ×1
sql ×1
sql-server ×1
triggers ×1
vb.net ×1
vba ×1
web-config ×1
windows ×1
xlink ×1
xpointer ×1
xsd ×1