冒着进入神圣战争领域的风险,这些流行的DI/IoC框架有哪些优点和缺点,可以轻松地被认为是最好的?..:
我还没有列出其他用于C#的DI/IoC框架吗?
在我的用例的上下文中,我正在构建一个客户端WPF应用程序,一个WCF/SQL服务基础架构,易用性(特别是在清晰简洁的语法方面),一致的文档,良好的社区支持和性能都是重要因素在我的选择.
所引用的资源和重复问题似乎已经过时,那些了解所有这些框架的人能否提出并提供一些真正的见解?
我意识到关于这个主题的大多数意见可能都有偏见,但我希望有人花时间研究所有这些框架,并且至少进行了一般性的客观比较.
如果以前没有这样做,我非常愿意自己进行调查,但我认为至少有一些人已经这样做了.
如果您有多个DI/IoC容器的使用经验,请对这些容器的优缺点进行排序和总结,谢谢.这不是发现人们制作的所有模糊小容器的练习,我正在寻找流行(和主动)框架之间的比较.
c# dependency-injection ninject ioc-container unity-container
作为ASP.NET MVC的新手,我一直想知道Controller方法的签名.在我看过的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例.
这是一个常见的例子:
public ActionResult Index()
{
return this.View();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将方法声明为public ViewResult Index()并获得更强的类型支持是不是更有意义?
实验表明这是有效的,所以似乎有可能.
我确实意识到可能存在需要多态的情况(例如,如果你只想在某些情况下重定向,但在其他情况下显示视图),但如果方法总是返回一个视图,我会发现更多的ViewResult可取的.
就未来的兼容性而言,ActionResult显然提供了更强大的签名,但如果有人控制整个代码库,则总是可以将方法的签名更改为更通用的返回类型(如果将来需要它).
是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?
假设我有一个基类TestBase,我定义了一个虚拟方法TestMe()
class TestBase
{
public virtual bool TestMe() { }
}
Run Code Online (Sandbox Code Playgroud)
现在我继承了这个类:
class Test1 : TestBase
{
public override bool TestMe() {}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用Reflection,我需要找出TestMe方法是否已在子类中重写 - 是否可能?
我需要它 - 我正在为类型"object"编写一个设计器可视化器来显示整个继承层次结构,并显示在哪个级别覆盖了哪些虚拟方法.
我在fedora 19中使用python.我想运行以下行Python:import shapely.geometry 出现以下错误:
OSError:无法找到或加载任何库geos_c icts of variants ['libgeos_c.so.1','libgeos_c.so']
我安装了Shapely包,以及以下两个库:
的glibc-2.17-4.fc19.i686.rpm
GEOS-3.3.8-2.fc19.i686.rpm
我只是在网上寻找这个问题的解决方案,但我还没找到
请帮我 !
Unity可以自动解决IEnumerable<T>吗?
假设我有一个带有这个构造函数的类:
public CoalescingParserSelector(IEnumerable<IParserBuilder> parserBuilders)
Run Code Online (Sandbox Code Playgroud)
我在容器中配置单个IParserBuilder实例:
container.RegisterType<IParserSelector, CoalescingParserSelector>();
container.RegisterType<IParserBuilder, HelpParserBuilder>();
container.RegisterType<IParserBuilder, SomeOtherParserBuilder>();
Run Code Online (Sandbox Code Playgroud)
我可以在不必实现自定义实现的情况下完成这项工作IEnumerable<IParserBuilder>吗?
var selector = container.Resolve<IParserSelector>();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我还没有以任何简单的方式表达这一点,但我仍然在提升Unity,所以我可能错过了一些东西.
我们如何使用CQRS/DDD模拟经典的多对多关系?
我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.
但是,我们假设我们在Book和Author之间有熟悉的关系.这是一种经典的多对多关系.
对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.
我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?
无论是书还是作者似乎是不错的候选值对象 ...
是否有键盘快捷键允许您在Visual Studio(2008)中轻松更改构建配置(例如,从调试到发布)?
在标准工具栏中有一个下拉列表,可以在构建配置之间轻松更改,但我只知道如何使用鼠标访问它.
有没有一种简单的方法可以通过键盘完成?
任何人都可以解释以下行为吗?
总之,如果在Visual Studio 2008中创建多个符合CLS的库并使它们共享一个公共命名空间根,则引用另一个库的库将需要引用该库的引用,即使它不使用它们.
用一句话解释起来相当困难,但这里是重现行为的步骤(密切关注命名空间):
创建一个名为LibraryA的库,并向该库添加一个单独的类:
namespace Ploeh
{
public abstract class Class1InLibraryA
{
}
}
Run Code Online (Sandbox Code Playgroud)
通过添加[assembly: CLSCompliant(true)]到AssemblyInfo.cs 确保库是CLS Compliant .
创建另一个名为LibraryB的库并引用LibraryA.将以下类添加到LibraryB:
namespace Ploeh.Samples
{
public class Class1InLibraryB : Class1InLibraryA
{
}
}
Run Code Online (Sandbox Code Playgroud)
和
namespace Ploeh.Samples
{
public abstract class Class2InLibraryB
{
}
}
Run Code Online (Sandbox Code Playgroud)
确保LibraryB也符合CLS.
请注意,Class1InLibraryB派生自LibraryA中的类型,而Class2InLibraryB则不派生.
现在创建一个名为LibraryC的第三个库,并引用LibraryB(但不是LibraryA).添加以下类:
namespace Ploeh.Samples.LibraryC
{
public class Class1InLibraryC : Class2InLibraryB
{
}
}
Run Code Online (Sandbox Code Playgroud)
这应该仍然可以编译.请注意,Class1InLibraryC派生自LibraryB 中不使用LibraryA中任何类型的类.
另请注意,Class1InLibraryC是在名称空间中定义的,该名称空间是LibraryB中定义的名称空间层次结构的一部分.
到目前为止,LibraryC没有引用LibraryA,因为它不使用LibraryA中的任何类型,所以解决方案会编译.
现在也使LibraryC CLS兼容.突然,解决方案不再编译,给你这个错误信息:
类型'Ploeh.Class1InLibraryA'在未引用的程序集中定义.您必须添加对程序集'Ploeh,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'的引用. …
在ASP.NET Web API中,HttpControllerContext实例提供了有关当前环境的大量信息,包括当前请求的URI.
如果服务依赖于此类信息(例如请求URI),则应该可以将该信息注入服务中.
使用Poor Man的DI很容易做到:只需实现一个自定义的IHttpControllerActivator.
然而,随着温莎城堡,这突然变得非常困难.以前,我已经描述了解决这个问题的一种非常复杂的方法,但它取决于PerWebRequest的生活方式,并且事实证明这种生活方式在自托管方案中不起作用,因为HttpContext.Current是空的.
到目前为止,我已经能够通过从自定义IHttpControllerActivator将所需信息作为内联参数传递给Resolve方法来完成这项工作:
public IHttpController Create(
HttpControllerContext controllerContext,
Type controllerType)
{
var baseUri = new Uri(
controllerContext
.Request
.RequestUri
.GetLeftPart(UriPartial.Authority));
return (IHttpController)this.container.Resolve(
controllerType,
new { baseUri = baseUri });
}
Run Code Online (Sandbox Code Playgroud)
但是,默认情况下,仅当立即请求的类型依赖于参数时才会起作用(即,如果请求的Controller本身依赖于该参数baseUri).如果依赖关系baseUri更深层地隐藏在依赖关系层次结构中,则默认情况下它不起作用,因为内联参数不会传播到更深层.
可以使用自定义IDependencyResolver(Castle Windsor IDependencyResolver,而不是ASP.NET Web API IDependencyResolver)更改此行为:
public class InlineDependenciesPropagatingDependencyResolver :
DefaultDependencyResolver
{
protected override CreationContext RebuildContextForParameter(
CreationContext current, Type parameterType)
{
if (parameterType.ContainsGenericParameters)
{
return current;
}
return new CreationContext(parameterType, current, true); …Run Code Online (Sandbox Code Playgroud) dependency-injection castle-windsor self-hosting asp.net-web-api
c# ×3
.net ×1
actionresult ×1
architecture ×1
asp.net-mvc ×1
cqrs ×1
dddd ×1
ienumerable ×1
mocking ×1
moq ×1
namespaces ×1
ninject ×1
overriding ×1
polymorphism ×1
python ×1
reference ×1
reflection ×1
self-hosting ×1
shapely ×1
tdd ×1
unit-testing ×1
viewresult ×1