我是IOC容器的新手,我开始使用NInject.
如果您希望构造函数具有非服务且不需要由IOC容器实例化的参数,您会怎么做?
例如:
public class Person
{
private readonly string _name;
private readonly IPersonRepository _repository;
public Person(string name, IPersonRepository repository)
{
_name = name;
_repository = repository;
}
......
}
Run Code Online (Sandbox Code Playgroud)
想象一下,name是Person类的要求,因此,为了确保Person始终具有名称,我们要求将其传递给构造函数.
我们如何使用NInject获取Person的实例?该名称需要通过应用程序创建新Person的任何位来传入,而IOC容器需要传入IPersonRepository.
我知道可以使用属性注入名称或存储库,但这不是一个干净的解决方案 - 我们正在失去一些编程语言的语义能力.
想象一下,我有以下类和接口:
public interface IService<T> { }
public class DefaultService<T> : IService<T> { }
public class FooService : IService<Foo> { }
public class BarService : IService<Bar> { }
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样从内核中获取实例:
Kernel.Get<IService<Foo>>(); // Should return FooService
Kernel.Get<IService<Bar>>(); // Should return BarService
Kernel.Get<IService<Dog>>(); // Should return DefaultService
Kernel.Get<IService<Cat>>(); // Should return DefaultService
Kernel.Get<IService<Giraffe>>(); // Should return DefaultService
Run Code Online (Sandbox Code Playgroud)
是否可以使用NInject设置绑定(可能使用约定扩展),这样我就不必手动绑定IService的每个可能的实现?
我正在尝试使用选择急切地获取集合,但我得到的只是内部联接.到底是怎么回事?
Session.CreateCriteria(typeof(Foo))
.SetFetchMode("Bars", FetchMode.Select)
.CreateAlias("Bars", "b")
.SetFetchMode("b.Bazes", FetchMode.Select)
.List();
Run Code Online (Sandbox Code Playgroud)
我已经尝试将FetchMode更改为Eager但这不起作用 - 我仍然得到内部联接而不是单独选择.我不知道它从哪里获得内部连接,因为文档中没有任何内容涉及FetchMode导致内部连接.是否有可能获得热切的选择?
更新 确定我发现创建别名会导致内部联接.所以我可以使用.CreateAlias("Bars","b",JoinType.None),但随后b.Bazes的获取将恢复为延迟加载.Urgh.
在寻求提高页面性能时,我之前没有提到的一种技术是使用setTimeout来阻止javascript阻止页面的呈现.
例如,假设我们有一个特别耗时的jQuery与html内联:
$('input').click(function () {
// Do stuff
});
Run Code Online (Sandbox Code Playgroud)
如果这段代码是内联的,那么当jquery忙于将点击处理程序附加到页面上的每个输入时,我们就会阻止页面的感知完成.
生成一个新线程是明智的:
setTimeout(function() {
$('input').click(function () {
// Do stuff
})
}, 100);
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一缺点是,用户在附加点击处理程序之前点击元素的可能性更大.但是,这种风险可能是可以接受的,即使没有setTimeout,我们也有一定程度的风险.
我是对的,还是我错了?
有没有办法阻止Visual Studio 2008在编辑页面和用户控件时检查css类是否存在?在每个用户控件上放置虚拟样式表似乎很荒谬.
Ayende有一篇关于如何使用事件处理程序为NHibernate(这里)实现简单审计跟踪的文章.
不幸的是,正如在注释中可以看到的那样,他的实现导致抛出以下异常:集合xxx未由flush()处理
问题似乎是在脏属性上对ToString的隐式调用,如果dirty属性也是映射实体,则会导致麻烦.
我尽最大努力建立一个有效的实施但没有运气.
有谁知道一个有效的解决方案?
我在MSDN中挖掘并发现这篇文章有一些有趣的建议:没有公共成员可以抛出或不抛出基于某些选项的异常.
例如:
Uri ParseUri(string uriValue, bool throwOnError)
Run Code Online (Sandbox Code Playgroud)
当然,我可以看到,在99%的情况下,这将是可怕的,但它偶尔使用是否合理?
我看到它使用的一种情况是在访问数据库或配置文件中的数据时使用"AllowEmpty"参数.例如:
object LoadConfigSetting(string key, bool allowEmpty);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,替代方法是返回null.但是调用代码会被空引用检查.(并且该方法还将排除实际允许null作为特定可配置值的能力,如果您如此倾向).
你的想法是什么?为什么这会是一个大问题?
最近出现了一个问题,即在执行更新后,添加到subversion存储库的一些新文件不会被下拉到其他客户端.
如果我用Tortoise浏览存储库,我可以看到该文件.然后我可以右键单击它并选择"更新到修订版本",这会将文件拉到客户端.不幸的是,这是非常耗时的,因为无法下拉文件夹中的所有文件 - 即我必须单独为每个文件执行此操作.
奇怪的是,它不会出现在所有文件中,并且不会在所有客户端计算机上发生.我已经尝试完全删除工作文件夹并再次将其全部拉下来,但问题仍然存在.
我正在使用最新版本的Tortoise和VisualSVN.
还有其他人看过这样的东西吗?
在Fluent Nhibernate中,在HasMany或HasManyToMany关系上指定AsSet()的效果是什么?
假设映射属性的类型是Iesi Set,那么之间有什么区别:
HasMany(x => x.MySetProperty)
.AsSet();
Run Code Online (Sandbox Code Playgroud)
和
HasMany(x => x.MySetProperty);
Run Code Online (Sandbox Code Playgroud) 而不是手动必须绑定每个类,建议使用哪些方法和模式来自动设置绑定?
例如,绝大多数绑定看起来像这样:
Bind<ICustomerRepository>.To<CustomerRepository>();
Run Code Online (Sandbox Code Playgroud)
一旦模块变大,你就可以得到100个看起来完全相同的绑定.这可以自动化吗?
ninject ×3
nhibernate ×2
c# ×1
constructor ×1
css ×1
exception ×1
javascript ×1
option ×1
parameters ×1
performance ×1
svn ×1
tortoisesvn ×1
validation ×1
visualsvn ×1