我有一个实现Singleton设计模式的对象缓存.我对单例的方法总是在首次访问属性时延迟加载静态实例.
public static Widget
{
get
{
if(instance==null) instance = new Widget();
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我知道这种方法不是线程安全的,并且实例检查为null会导致效率低下.在实例化静态实例的类上实现静态构造函数是否明智?
据我所知,只要第一次静态属性访问发生,就会调用静态构造函数.这是否有效,它是否会提供超过当前延迟加载方法的任何好处,或者更好地探索代理实现,还是使用锁来强制它是线程安全的?
public static Widget
{
get
{
if(instance==null)
{
lock(padlock)
{
if(instance==null) instance = new Widget();
}
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有很多静态构造函数的经验,所以如果它是延迟加载属性的相同或更差的实现,不要想要实现这个想法.
干杯,加里
我有一个类似于这样的类结构:
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
Run Code Online (Sandbox Code Playgroud)
我需要检索设备列表,或者单个设备,它被实例化为适当的派生类型(基于DB中设备记录中的类型值).也就是说,Device对象集合应该包含许多具有不同类型的对象,所有这些对象都是从中派生出来的Device.
我已经通过以下方式实现了这一点,但是对它感觉不对.
public static IEnumerable<Device> AllDevices()
{
using (var connection = CreateConnection())
{
connection.Open();
return connection.Query<dynamic>("SELECT * FROM Device").Select<dynamic, Device>(d =>
{
Device device = null;
if (d.DeviceTypeID == 1)
device = new DeviceA();
else if (d.DeviceTypeID == 2)
device = new …Run Code Online (Sandbox Code Playgroud) 我正在使用访问控制服务来授权访问特定服务标识的特定服务总线订阅.
当从订阅接收会话或消息时,服务标识被授权并且可以根据需要接收和完成或放弃消息.
但是,我没有看到UnauthorizedAccessException尝试访问服务标识无权访问的订阅时,也没有在尝试执行规则组未针对该服务标识和依赖项发出声明的操作时看到此异常派对(如发送消息或创建主题).
相反,我最终看到了一个TimeoutException - "The timeout elapsed upon attempting to obtain a token while accessing 'https://namespace-sb.accesscontrol.windows.net/WRAPv0.9/'".内部例外是一个SecurityTokenException - "The token provider was unable to provide a security token while accessing 'https://namespace-sb.accesscontrol.windows.net/WRAPv0.9/'. Token provider returned message: 'The operation has timed out'".这会导致RetryPolicy出现问题,因为Timeout Exception被认为是瞬态的.
但奇怪的是,我UnauthorizedAccessException在尝试接收订阅描述时收到了.根据服务总线操作所需的权利,应该可以在... myTopic/Subscriptions/mySubscription范围内使用Listen Claim提供服务标识.
我有以下设置:
我看到以下问题:
var manager …Run Code Online (Sandbox Code Playgroud) 我试图在将BrokeredMessage.Properties集合属性发送到Azure Service Bus之前将其添加到集合中.自定义属性类型是枚举:
[Serializable, DataContract]
public enum FooBar
{
[EnumMember]
Foo = 0,
[EnumMember]
Bar = 1
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过各种各样的属性组合,以及没有属性的版本.
这是添加属性并发送消息的代码:
var brokeredMessage = new BrokeredMessage(new MessageObject(){ //etc });
brokeredMessage.Properties.Add("FooBar", FooBar.Foo);
queueClient.Send(brokeredMessage);
Run Code Online (Sandbox Code Playgroud)
尝试发送消息时返回以下错误:
System.Runtime.Serialization.SerializationException : Serialization operation failed due to unsupported type Namespace.FooBar.
Run Code Online (Sandbox Code Playgroud)
我试图找到一些关于BrokeredMessage.Properties限制的详细文档(如果有的话),并且找不到任何指定只能使用基本类型的文档.
关于为什么这不起作用的任何想法?
编辑:
应该说我使用的是Microsoft.ServiceBus的V2.1.0.0.
我正在使用Visual Studio Online中的新脚本化构建功能(而不是XAML构建定义),并且我尝试使用构建号格式使构建版本号包含目标存储库的最新Git Commit ID.
我使用以下内部版本号格式:
$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceVersion)
Run Code Online (Sandbox Code Playgroud)
这导致生成的版本号1.0.1234.- 即SourceVersion值为空,这在排队构建时导致VSO错误.我也尝试通过在变量前面添加Build.相同的结果来限定变量.为了测试,我已将构建号更改为以下格式:
$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceBranch)
Run Code Online (Sandbox Code Playgroud)
这正确地导致了值 1.0.1234.refs_heads_master
我一直在使用Predefined Variables参考,Build.SourceVersion被列为全局变量.
我做错了什么,我遇到过一个错误,或者这是设计的,在构建排队时不可用?如果这是设计的,有没有办法在Build Number格式中自动包含简短的Git Commit ID?
这是我在没有明确指定Git CommitId时看到的错误:
400:内部版本号格式字符串$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceVersion)生成内部版本号0.1.1.其中包含无效字符,太长或以'.'结尾.内部版本号的最大长度为255个字符.不允许的字符包括'"','/',':','<','>','\','|','?','@'和'*'.
我刚刚开始使用CruiseControl.Net建立持续集成服务器.为了简单起见,我使用Visual Studio Task来执行构建,将其指向项目解决方案文件.但是,当构建过程发生时,CC.Net成功从Subversion获取最新的源版本,并且似乎运行devenv命令.然后构建过程失败,但没有解释原因.这是输出:
BUILD FAILED
项目:MyProject
构建日期:2009-09-09 16:31:13
运行时间:00:00:49
集成请求:仪表板触发了构建(ForceBuild)自上次构建后的修改(0)
测试运行:0,失败:0,未运行:0,时间:0秒无测试运行此项目没有任何测试
页面上没有显示任何其他内容.我的XML日志也没有显示任何构建结果.
这是我的配置文件:
<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
<project name="MyProject">
<workingDirectory>C:\Users\Builder\Desktop\builder-pc\MyProject</workingDirectory>
<sourcecontrol type="svn">
<trunkUrl>svn://builder-pc/MyProject/trunk</trunkUrl>
<workingDirectory>C:\Users\Builder\Desktop\builder-pc\MyProject</workingDirectory>
<executable>C:\Program Files\Subversion\bin\svn.exe</executable>
<autoGetSource>True</autoGetSource>
<tagOnSuccess>True</tagOnSuccess>
</sourcecontrol>
<tasks>
<devenv>
<solutionfile>C:\Users\Builder\Desktop\builder-pc\MyProject\trunk\MyProject.sln</solutionfile>
<configuration>release</configuration>
<buildtype>Rebuild</buildtype>
<executable>C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe</executable>
<buildTimeoutSeconds>600</buildTimeoutSeconds>
</devenv>
</tasks>
</project>
</cruisecontrol>
Run Code Online (Sandbox Code Playgroud)
我故意删除了SVN用户名和密码等内容.
使用VS命令提示符构建解决方案可以正常工作,尽管有警告.这是使用CC.Net将使用的相同的swtiches.
有人可以帮忙吗?它是否失败,因为没有运行单元测试,或者是因为警告?或者最好切换到MSBuild或NAnt而不是使用Visual Studio任务?