.NET和Java都有大量可用的DI/IoC容器,每个容器都有许多模式,我发现这些模式在处理它们的各个方面非常有用.我现在正想在JavaScript中做同等的事情.由于JavaScript是一种动态语言,我不希望DI/IoC容器直接等同于静态类型语言中的容器提供的所有功能,因此欢迎使用这些模式的替代方案.我还希望JavaScript中提供的DI/IoC容器的功能会有所不同,因此对不同容器的引用非常受欢迎.
以下模式是Autofac 3支持的模式,我认为这些模式适用于动态语言.有关这些模式和关系的一般信息,请参阅 http://autofac.readthedocs.org/en/latest/resolve/relationships.html和 http://nblumhardt.com/2010/01/the-relationship-zoo/.以下概念中的大多数(如果不是全部)也可以使用其他语言和DI/IoC容器,例如Google Guice和Spring.
与JavaScript中下面描述的概念和模式最接近的等价物是什么?
在IoC容器可以创建类型的实例之前,它需要知道类型.这是通过注册完成的.注册通常以声明方式完成:
class A {}
var builder = new ContainerBuilder();
builder.RegisterType<A>();
Run Code Online (Sandbox Code Playgroud)
上面使IoC容器知道类型A.它通过反射发现A的依赖性.注册也可以通过充当工厂的功能进行.这些函数通常是lambdas,可以内联编写:
class B {}
class A {
A(string name, B b) { }
}
builder.RegisterType<B>();
builder.Register(c => // c is a reference to the created container
new A("-name-", c.Resolve<B>()));
Run Code Online (Sandbox Code Playgroud)
当您的类型需要使用不是服务的依赖项(例如上面示例中的名称)进行参数化时,能够提供工厂函数特别有用.
由于C#支持接口和抽象类,因此它通常不是重要的具体数据类型,而是它实现的抽象类型.在这些情况下,您将该类型注册为应该可用的接口或抽象类:
interface IPlugin {}
class P : IPlugin
builder.RegisterType<P>().As<IPlugin>();
Run Code Online (Sandbox Code Playgroud)
通过上面的注册,任何请求a的尝试P都会失败,但是对a的请求IPlugin会成功.
完成所有注册后,需要创建容器:
public class Program {
public …Run Code Online (Sandbox Code Playgroud) javascript c# dependency-injection inversion-of-control autofac
在维护和新功能之间应该在哪里划线?
牛津英语词典将维护定义为:
(7.a)保持工作秩序,维修等的行为; 通过提供设备等手段来保持建筑物,机构,部队等; 如此保持的状态或事实; 保养的意思或规定.
我正在使用客户端 - 服务器应用程序并维护客户端.根据定义,我希望执行:
我不希望表演:
维基百科软件维护页面引用了纠正,自适应,完善和预防性维护,这似乎与我期望的一致,但客户端 - 服务器性质使问题复杂化.
编辑:对于没有依赖关系的独立应用程序,如果软件正常工作,它应该继续工作.使用客户端 - 服务器应用程序,客户端可能会在服务器更改时中断.虽然这不会改变维护的定义,但这意味着有必要对客户端应用程序进行更改时有更多的机会和场合.
如果双方要就维护合同达成一致意见,则必须相互理解什么是合格和维护以及哪些合格作为新功能,因此问题就在于此.
我想添加jpoller.jar为maven依赖项,因此我编辑了我的pom.xml文件以包含它:
<dependency>
<groupId>org.sadun</groupId>
<artifactId>jpoller</artifactId>
<version>1.5.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在,正如预期的那样,当我从命令行编译时,我得到一个错误,因为jpoller它不在我列在我的pom中的任何存储库中,也不能找到它.虽然我可以为它创建一个存储库,但我不想在这一点上.因此,我收到以下错误:
[INFO]无法解决工件.
缺少:---------- 1)org.sadun:jpoller:jar:1.5.2
尝试从项目网站手动下载文件.
然后,使用以下命令安装它:mvn install:install-file -DgroupId = org.sadun -DartifactId = jpoller -Dversion = 1.5.2 -Dpackaging = jar -Dfile =/path/to/file
如何在没有maven CLI的机器上的M2Eclipse插件中执行此操作?
我希望能够将内存映射到文件描述符,以便我可以使用一些需要文件描述符的现有函数.这基本上就是我在寻找的东西:
void do_operation1(int fd);
char data[DATA_MAX] = { /* embedded binary data */ };
int fd = addr_to_fd(data, DATA_MAX);
do_operation1(fd);
/* ... operate on fd ... */
Run Code Online (Sandbox Code Playgroud)
我可以使用什么系统调用或调用来实现此目的?
我正在创建一个cli工具来管理现有的应用程序.应用程序和测试都构建良好并运行良好,但尽管我在运行jar中存在的cli工具时收到了javassist失败:
INFO: Bytecode provider name : javassist
...
INFO: Hibernate EntityManager 3.5.1-Final
Exception in thread "main" javax.persistence.PersistenceException: Unable to configure EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:371)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
...
at com.sophware.flexipol.admin.AdminTool.<init>(AdminTool.java:40)
at com.sophware.flexipol.admin.AdminTool.main(AdminTool.java:69)
Caused by: java.lang.RuntimeException: Error while reading file:flexipol-jar-with-dependencies.jar
at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:131)
at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:467)
at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:457)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:347)
... 11 more
Caused by: java.io.IOException: invalid constant type: 60
at javassist.bytecode.ConstPool.readOne(ConstPool.java:1027)
at javassist.bytecode.ConstPool.read(ConstPool.java:970)
at javassist.bytecode.ConstPool.<init>(ConstPool.java:127)
at javassist.bytecode.ClassFile.read(ClassFile.java:693)
at javassist.bytecode.ClassFile.<init>(ClassFile.java:85)
at org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(AbstractJarVisitor.java:243)
at org.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(AbstractJarVisitor.java:209)
at org.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisitor.java:170)
at org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements(FileZippedJarVisitor.java:119)
at org.hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries(AbstractJarVisitor.java:146)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试将OpenCover与CruiseControl.NET集成.此时我已经通过构建系统进行了修改,因此它在OpenCover下运行我的nunit测试.然后,我使用ReportGenerator生成Xml和Html报告.
假设可以将ReportGenerator生成的报告集成到CruiseControl.NET webapp中,我该如何将它们集成?
NCover有自己的NCoverReporting任务可以使用,但由于我没有运行NCover,我无法将其输出与OpenCover生成的XML报告进行比较.
相关的想法/问题:
我正在调试其他人的Qt程序并遇到以下错误消息,我不明白:
DWARF-2 expression error: DW_OP_reg operations must be used either alone or in
conjuction with DW_OP_piece or DW_OP_bit_piece.
Run Code Online (Sandbox Code Playgroud)
我不确定这意味着什么,谷歌没有多大帮助.
这是上下文 - sLocation是QString之前声明的几行.但是,它是从内联的函数创建的,所以我不确定它的值,并且我在尝试检查之前被追加到:
(gdb) printqstring suffix
(QString)0xffffbd80: "sorted"
(gdb) next
1241 sLocation += suffix;
(gdb) printqstring sLocation
Can't take address of "sLocation" which isn't an lvalue.
(gdb) info local
sLocation = <error reading variable sLocation (DWARF-2 expression error:
DW_OP_reg operations must be used either alone or in conjuction with
DW_OP_piece or DW_OP_bit_piece.)>
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下该错误信息的含义或可能导致的错误信息吗?
我有一个简单的MVC应用程序,我正在尝试添加一个异常过滤器.为此,我遵循Autofac WebAPI Integration文档,我相信它适用于Autofac.WebApi2 NuGet包.
首先,我创建了异常过滤器:
public class ErrorLoggingExceptionFilter : IAutofacExceptionFilter
{
public void OnException(HttpActionExecutedContext context)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将AutofacControllerConfiguration属性添加到我想要应用异常过滤器的API控制器基类:
[AutofacControllerConfiguration]
public class ApiControllerBase : ApiController {}
Run Code Online (Sandbox Code Playgroud)
然后我用Autofac 注册了异常过滤器:
builder.RegisterType<ErrorLoggingExceptionFilter>()
.AsWebApiExceptionFilterFor<ApiControllerBase>()
.InstancePerApiRequest();
Run Code Online (Sandbox Code Playgroud)
此时应用程序仍然正常运行,但异常过滤器没有运行,因此我注册了autofac的过滤器提供程序:
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)
一旦添加,我开始得到500's,出现以下错误:
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Autofac.Features.Metadata.Meta.1[System.Web.Http.Filters.IOverrideFilter]' can be invoked with the available services and parameters: Cannot resolve parameter 'System.Web.Http.Filters.IOverrideFilter value' of constructor 'Void .ctor(System.Web.Http.Filters.IOverrideFilter, System.Collections.Generic.IDictionary2[System.String,System.Object])'
我没有在这个项目中使用任何元数据,也不知道任何事情IOverrideFilter …
据我所知,Get-Member可以显示一个对象的所有成员,但我看到一个Count我无法解释的成员:
PS> $job = start-job {dir c:\ }
PS> $job | get-member -Force -View All -MemberType All | select-string Count
# outputs nothing
PS> $job.Count
1
Run Code Online (Sandbox Code Playgroud)
伯爵成员来自哪里?
autofac ×2
asp.net-mvc ×1
c ×1
c# ×1
c++ ×1
cglib ×1
debugging ×1
dependencies ×1
gdb ×1
hibernate ×1
java ×1
javascript ×1
javassist ×1
m2eclipse ×1
maintenance ×1
maven-2 ×1
mmap ×1
opencover ×1
pom.xml ×1
posix ×1
powershell ×1
qt ×1
system-calls ×1
unix ×1