小编Gav*_*vin的帖子

将NHibernate与存储库模型一起使用的最佳方法

我有一个存储库类,它定义了一些基本的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号),非常有用.我最初感到困惑,因为我虽然在业务层中设置了"工作单元",但是我很快就纠正了.

vb.net nhibernate repository

8
推荐指数
1
解决办法
3523
查看次数

在Windows中使用Git Bash有什么命令,例如在git diff模式下?

在Windows中,在Git Bash中,如果我执行git diff,我会将所有差异刷新到控制台,并提供某种控制输出缓冲区的提示.在这种Git Bash模式下我可以使用哪些命令?我不知道在哪里寻找快速参考.

我已经解决了<Enter>将滚动一行,<Space>并将滚动所有行,但没有更多.要退出我做一个Ctrl-C,它似乎回到命令提示符,但有时当我开始键入一个新命令时,它似乎回到未完成的diff输出,我很困惑为什么.

我知道,真是愚蠢的问题.

windows git bash

8
推荐指数
1
解决办法
3023
查看次数

我可以针对XML模式验证XPath表达式吗?

您可以针对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)

......虽然我知道如果我真的不得不这样做的话.

干杯!

.net xml xpath xsd

7
推荐指数
1
解决办法
4586
查看次数

我可以在Word或Excel中创建撤消事务吗?(VSTO)

我注意到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中做了一些可以同时进行多项更改的东西,如果用户必须多次点击撤消,这对用户来说会有点烦人.他们犯了一个错误.虽然这些特定功能似乎不存在,但是有人知道是否/如何以某种方式完成这项工作?

.net excel vba vsto ms-word

6
推荐指数
1
解决办法
8427
查看次数

这段代码是线程安全的吗?如何使其线程安全?

我有一个带有安全类的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)

关于线程的原理有很多讨论,但是当涉及到实际应用它时,我倾向于陷入困境并且知道何时应用它.任何帮助赞赏.

如果不清楚,我可以更详细地解释这些功能的背景/目的.

编辑: …

.net c# wcf multithreading thread-safety

6
推荐指数
1
解决办法
1566
查看次数

netTcpBinding最快的安全配置是什么?

我正在运行一个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)

security wcf nettcpbinding

6
推荐指数
1
解决办法
2755
查看次数

如何防止Visual Studio提示从app.config更新.settings文件

我们使用.settings文件来存储我们的应用程序设置,并在那里使用默认值,这样我们就不需要配置每个设置了.这一般都很好.

但是,在开发过程中我们会经常更改app.config中的值,这意味着当我们打开.settings文件时,我们总是会在app.config文件中更改"设置'x'的值."你想要吗?更新.settings文件中的值?"

替代文字

在我们的例子中,正确的做法是始终单击否,否则开发设置可以相对容易地进入测试和生产环境.但是,既然我们是人类,那并不总是会发生什么.更糟糕的是,默认按钮为"是".

我们可以在某种程度上删除人类元素并使Visual Studio不要问我们这个吗?或者我们是否应该放弃依赖默认设置并在app.config中为每个单一环境中的每个设置定义一个显式条目?

settings configuration app-config web-config visual-studio-2008

6
推荐指数
1
解决办法
1212
查看次数

你会在一个新的商业项目中使用S#arp架构吗?

小号#ARP架构似乎真的很酷,但你认为它仍然太新作中的一个重要的新项目的承诺呢?(我们假设该项目乍一看似乎非常适合它.)

这一切都似乎很不错,我只是担心,新的项目我的工作是使用所有的新技术- WCF,ASP.NET MVC等等-而如果我多加一个婴儿技术,我将结束很多问题,没有足够的技术技能或社区支持来解决它们......

我内心那个要求很高的男孩真是太难了:我想拥有最新的东西!

(声明:我是很新的S#的arp架构,所以我主要是立足于项目的既定目标我对它的乐观态度,文章,示例代码等位)

.net architecture frameworks s#arp-architecture

5
推荐指数
2
解决办法
2643
查看次数

指向C中无效指针的指针 - 我可以使用void**进行基本多态性吗?

我可以理解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)

......他们可能被称为,例如,像这样: …

c void-pointers

4
推荐指数
1
解决办法
1165
查看次数

INSERT可以在触发器"插入"表中产生多行吗?

我知道在触发器中 - 至少对于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点.我会把这个问题留给那些应该知道更好的人.

sql sql-server triggers insert

4
推荐指数
1
解决办法
1827
查看次数

如何找到未记录的.NET/COM库函数?

如何找出从某些.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)

尽管如此,仍然会对任何未记录的函数资源感兴趣.

.net com vsto

2
推荐指数
1
解决办法
1274
查看次数

使用XLink引用同一文档中的节点

简单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文档中的特定部分.

谢谢!

xml xpath xlink xpointer

2
推荐指数
1
解决办法
915
查看次数