我目前有一个单例,初始化最多可能需要10秒.但是,我不希望我的用户对此初始化进行惩罚(等待),因此我宁愿在应用程序启动期间在后台线程上引导此组件.这就是我所拥有的:
辛格尔顿:
public class MySingleton
{
private static MySingleton _instance;
private static readonly object _locker = new object();
private MySingleton()
{
Init();
}
public static MySingleton Instance
{
if(_instance == null) _instance = new MySingleton();
return _instance;
}
public void Init()
{
lock(_locker)
{
if(_instance != null) return;
// long running code here...
}
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序启动:
Task.Factory.StartNew(() => MySingleton.Instance.Init());
Run Code Online (Sandbox Code Playgroud)
这段代码可以正常工作,防止双初始化,在初始化之前防范用户需要它的边缘情况,并防止有人忘记调用Init().
然而,由于两个原因,它感觉有点笨重:a)我将在启动时两次进入Init方法.b)我想在单例内部进行线程化,但必须启动初始化.
是否有更清洁/更好/更好的方法来处理这个?
在此先感谢大家的帮助.
**编辑:正如评论中指出的那样,Init被误认为是私有的.它应该是公开的并且已得到纠正.
如果我有这样的表结构:
ProductCode Date
Foo 4/1/2012
Foo 4/2/2012
Foo 4/3/2012
Foo 4/6/2012
Foo 4/7/2012
Foo 4/8/2012
Foo 4/9/2012
Foo 4/10/2012
Foo 4/15/2012
Foo 4/16/2012
Foo 4/17/2012
Run Code Online (Sandbox Code Playgroud)
有没有办法查询给定的日期范围ProductCode
和Date
(假设范围必须是连续的)?换句话说,对于该表中,富存在于3个日期范围:4/1-4/3
; 4/6-4/10
; 并且4/15-4/17
我正在寻找给定日期的日期范围.
请注意,Foo
没有日期的4/4
,4/5
,4/11
,4/12
,4/13
和4/14
.
示例:
ProductCode=Foo, Date=4/2
将返回,4/1-4/3
因为条目是顺序的.
ProductCode=Foo, Date=4/4
将返回任何
ProductCode=Foo, Date=4/7
不会返回,4/6-4/10
因为条目是顺序的.
ProductCode=Foo, Date=4/12
将返回什么
等等.
我环顾四周,无法找到问题的答案.我要做的是条件映射目标对象(不是字段/属性,对象).换句话说,这样的事情:
public class Source
{
public int Id {get; set;}
public string Flag {get; set;}
}
public class Destination
{
public int Id {get; set;}
}
var sources = new List<Source>
{
new Source{Flag = "V", Id = 1},
new Source{Flag = "B", Id = 2}
};
var destinations = Mapper.Map<List<Source>, List<Destination>>(sources);
destinations.Count.ShouldEqual(1);
destinations[0].Id.ShouldEqual(2);
Run Code Online (Sandbox Code Playgroud)
有谁知道如何配置类型映射?我正在寻找类似的东西:
Mapper.CreateMap<Source, Destination>()
.SkipIf(src => src.Flag != "B");
Run Code Online (Sandbox Code Playgroud)
我只是在配置选项中看不到任何似乎支持这一点的内容.任何帮助将非常感激!提前致谢.