小编Mar*_*ann的帖子

主要的C#DI/IoC框架如何比较?

冒着进入神圣战争领域的风险,这些流行的DI/IoC框架有哪些优点和缺点,可以轻松地被认为是最好的?..:

  • Ninject
  • 统一
  • Castle.Windsor
  • Autofac
  • StructureMap

我还没有列出其他用于C#的DI/IoC框架吗?

在我的用例的上下文中,我正在构建一个客户端WPF应用程序,一个WCF/SQL服务基础架构,易用性(特别是在清晰简洁的语法方面),一致的文档,良好的社区支持和性能都是重要因素在我的选择.

更新:

所引用的资源和重复问题似乎已经过时,那些了解所有这些框架的人能否提出并提供一些真正的见解?

我意识到关于这个主题的大多数意见可能都有偏见,但我希望有人花时间研究所有这些框架,并且至少进行了一般性的客观比较.

如果以前没有这样做,我非常愿意自己进行调查,但我认为至少有一些人已经这样做了.

第二次更新:

如果您有多个DI/IoC容器的使用经验,请对这些容器的优缺点进行排序和总结,谢谢.这不是发现人们制作的所有模糊小容器的练习,我正在寻找流行(和主动)框架之间的比较.

c# dependency-injection ninject ioc-container unity-container

298
推荐指数
7
解决办法
10万
查看次数

ASP.NET MVC控制器方法必须返回ActionResult吗?

作为ASP.NET MVC的新手,我一直想知道Controller方法的签名.在我看过的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例.

这是一个常见的例子:

public ActionResult Index()
{
    return this.View();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将方法声明为public ViewResult Index()并获得更强的类型支持是不是更有意义?

实验表明这是有效的,所以似乎有可能.

我确实意识到可能存在需要多态的情况(例如,如果你只想在某些情况下重定向,但在其他情况下显示视图),但如果方法总是返回一个视图,我会发现更多的ViewResult可取的.

就未来的兼容性而言,ActionResult显然提供了更强大的签名,但如果有人控制整个代码库,则总是可以将方法的签名更改为更通用的返回类型(如果将来需要它).

是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?

polymorphism asp.net-mvc actionresult viewresult

57
推荐指数
4
解决办法
3万
查看次数

使用Reflection(C#)检测方法是否被覆盖

假设我有一个基类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"编写一个设计器可视化器来显示整个继承层次结构,并显示在哪个级别覆盖了哪些虚拟方法.

c# reflection overriding

56
推荐指数
4
解决办法
2万
查看次数

无法找到库geos_c或加载其任何变体

我在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

我只是在网上寻找这个问题的解决方案,但我还没找到

请帮我 !

python shapely

53
推荐指数
5
解决办法
3万
查看次数

使用moq模拟虚拟只读属性

我找不到办法做到这一点,虽然这可以手工完成,所以为什么不用moq?

tdd unit-testing moq mocking

43
推荐指数
1
解决办法
1万
查看次数

用Unity解析IEnumerable <T>

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,所以我可能错过了一些东西.

c# ienumerable dependency-injection unity-container

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

替代与CQRS的多对多关系

我们如何使用CQRS/DDD模拟经典的多对多关系?

我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.

但是,我们假设我们在BookAuthor之间有熟悉的关系.这是一种经典的多对多关系.

对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.

我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?

无论是还是作者似乎是不错的候选值对象 ...

architecture domain-driven-design cqrs dddd

37
推荐指数
1
解决办法
3417
查看次数

用于在Visual Studio中的调试和释放模式之间切换的键盘快捷方式

是否有键盘快捷键允许您在Visual Studio(2008)中轻松更改构建配置(例如,从调试到发布)?

在标准工具栏中有一个下拉列表,可以在构建配置之间轻松更改,但我只知道如何使用鼠标访问它.

有没有一种简单的方法可以通过键盘完成?

keyboard-shortcuts visual-studio

31
推荐指数
2
解决办法
4884
查看次数

CLSCompliant(true)拖拽未使用的引用

任何人都可以解释以下行为吗?

总之,如果在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'的引用. …

.net namespaces reference cls-compliant visual-studio-2008

29
推荐指数
2
解决办法
2727
查看次数

使用Castle Windsor解析HttpControllerContext

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

27
推荐指数
1
解决办法
2155
查看次数