对于Java开发人员来说,这必须是一个非常基本的问题,但是在给定类名的情况下找到合适的jar文件的最佳方法是什么?
例如,给定" com.ibm.websphere.security.auth.WSSubject ",如何跟踪相应的jar文件?("谷歌"不是我正在寻找的答案!)
在Java文档不给jar文件的任何暗示,明显的jar的名称文件本身不提供线索.
在java世界中必须有一个"搜索本地jar"或某种"自动解析依赖"技巧.理想情况下,我正在寻找"官方"的方式来做到这一点.我碰巧在没有cygwin的Windows机器上.
我的理解是:
IBM的这个图表很有帮助:

会话bean和实体bean [又名MDP]允许您发送JMS消息并同步接收它们,但不是异步接收它们.为避免占用服务器资源,您可能不希望在服务器端组件中使用阻塞同步接收.要异步接收消息,请使用消息驱动的bean [MDB].
所以到目前为止我不满意的清单是:
我的问题是:还有其他差异吗?你能澄清一下这个区别吗?
参考文献:
虽然这个问题与StructureMap有关,但我的一般问题是:
在代码中使用IoC容器连接组件时(而不是通过xml进行配置),您通常需要对所有程序集进行显式项目/构建引用吗?
为什么单独的组件?因为:
"与其具体实现相关的独立程序集中的抽象类是实现这种分离的好方法." - 框架设计指南第91页
例:
假设我有PersonBase.dll和Bob.dll
Bob继承自抽象类PersonBase.它们都在Person命名空间中.但在不同的集会中.
我正在为PersonBase编程,而不是Bob.
回到我的主要代码中,我需要一个人.StructureMap可以扫描装配体.好的,我会问一下StructureMap!
现在,在我的主要代码中,我当然只是指PersonBase,而不是Bob.其实,我不希望我的代码知道任何关于鲍勃.没有项目参考,没有nuthin.这就是重点.
所以我想说:
//Reference: PersonBase.dll (only)
using Person;
...
//this is as much as we'll ever be specific about Bob:
Scan( x=> { x.Assembly("Bob.dll"); }
//Ok, I should now have something that's a PersonBase (Bob). But no ?
ObjectFactory.GetAllInstances<PersonBase>().Count == 0
Run Code Online (Sandbox Code Playgroud)
没运气.我希望鲍勃做的工作是明确的:
//Reference: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用IoC /依赖注入,同时编程为契约而不是特定的类.我所面临的困境是两者之间的紧张关系:
为IoC接口编程:我开始时IoC严重依赖接口.从Spring的示例项目来看,接口是在编写与IoC签订合同时的方法.
(...虽然抽象类通常是首选的:接口的主要缺点是,当允许API的演变时,它们的灵活性远远低于类)
通过构造函数使类依赖性显式化 我的直觉是,将依赖项传递给类的构造函数是一种很好的编程习惯.实际上,这是依赖注入.
...除非您不能在接口/抽象语句中强制执行构造函数签名:接口或抽象类都不允许定义构造函数签名(轻松/优雅).另请参见框架设计指南第4.4节: 不要在抽象类型中定义公共或受保护的内部构造函数....只有当用户需要创建该类型的实例时,构造函数才应该是公共的.
这个问题与之前的stackoverflow问题有关:定义构造函数签名的接口?
但我的问题是:
因为您无法在C#接口/抽象类中定义构造函数,正如上面的问题所要求的那样,在实际层面上:
你如何将这与通过构造函数传递依赖关系的明智做法相协调?
编辑:谢谢你的回答.我希望能在这种情况下对我应该做些什么有所了解.只是不使用contructor args?使用某种确实采用依赖关系的Init()方法?编辑2:谢谢你的答案,非常有帮助.
c# abstract-class dependency-injection interface inversion-of-control
我遇到了一些令人讨厌的问题,WPF应用程序崩溃在某些客户端计算机上,但在其他地方工作 - 每个开发人员的噩梦.
我在这里发布问题/解决方案,以帮助保持开发人员的理智.这些都不容易排除故障.
这两个问题都是经典的"它适用于我的机器但不适用于我们的机器"问题.
更新
在StackOverflow的维基精神中,这是一个更新:
我在下面抨击了Joe White的IValueConverter建议.它就像一个魅力.
我写了一个"快速入门"的例子,它使用一些廉价的字符串替换自动映射ViewModels-> Views.如果未找到代表ViewModel的View,则默认为"Under Construction"页面.我正在配音这种方法"WPF MVVM White",因为这是Joe White的想法.这是一些截图.
第一个图像是"[SomeControlName] ViewModel"具有相应的"[SomeControlName] View",基于纯命名约定.第二种情况是ModelView没有任何视图来表示它.没有更多的ResourceDictionaries具有长ViewModel来查看映射.现在它是纯粹的命名约定.

我在这里发布了一个项目下载: Mvvm.White.Quickstart.zip
原帖
我在周末阅读了Josh Smith 关于WPF MVVM 的精彩MSDN文章.它注定是一个邪教经典.
我花了一些时间来讨论要求WPF呈现ViewModel的魔力.
这就像是说"这是一个类,WPF.去弄清楚用哪个UI来呈现它."
对于那些错过这种魔力的人来说,WPF可以通过在ResourceDictionary映射中查找View for ModelView并拉出相应的View来实现这一点.(向下滚动到图10提供视图).
立即跳出来的第一件事是,已经有一个强大的命名约定:
classNameView ("View" suffix)
classNameViewModel ("ViewModel" suffix)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
由于ResourceDictionary可以以编程方式进行操作,我想知道是否有人设法使用Regex.将整个事情放弃,因此查找是自动的,并且任何新的View/ViewModel都会因其命名约定而得到解决?
[编辑]我想象的是对ResourceDictionary的钩子/拦截.
...还考虑启动时使用interop拉出的方法*View$和*ViewModel$类名来在代码中构建DataTemplate字典:
//build list
foreach ....
String.Format("<DataTemplate DataType=\"{x:Type vm:{0} }\"><v:{1} /></DataTemplate>", ...)
Run Code Online (Sandbox Code Playgroud) 如果这个问题没有很好地制定,请耐心等待.不知道是问题的一部分.
我想要完成的一个例子可以在WPF中的PropertyChangedEventArgs中找到.如果要在WPF中标记属性已更改,则执行以下操作:
PropertyChanged(this, new PropertyChangedEventArgs("propertyName"));
Run Code Online (Sandbox Code Playgroud)
您将字符串传递给PropertyChangedEventArgs,它引用已更改的属性名称.
您可以想象我不希望在我的代码中使用硬编码字符串作为属性名称.当然,重构重命名错过了它,这使得它不仅在美学上没有吸引力,而且还容易出错.
我更倾向于参考房产本身 ...不知何故.
PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?));
Run Code Online (Sandbox Code Playgroud)
看起来我应该能够用一个简短的方法来包装它,让我说出类似上面的内容.
private void MyPropertyChanged(??) {
PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??));
}
... so I can say something like:
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself*
Run Code Online (Sandbox Code Playgroud)
到目前为止,我正在画一个空白.
我今天遇到了这段代码:
public static byte[] ReadContentFromFile(String filePath)
{
FileInfo fi = new FileInfo(filePath);
long numBytes = fi.Length;
byte[] buffer = null;
if (numBytes > 0)
{
try
{
FileStream fs = new FileStream(filePath, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
buffer = br.ReadBytes((int)numBytes);
br.Close();
fs.Close();
}
catch (Exception e)
{
System.Console.WriteLine(e.StackTrace);
}
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是将其重构为:
public static byte[] ReadContentFromFile(String filePath)
{
return File.ReadAllBytes(filePath);
}
Run Code Online (Sandbox Code Playgroud)
System.IO.File.ReadAllBytes记录为:
打开二进制文件,将文件内容读入字节数组,然后关闭文件.
...但我错过了一些关键的区别吗?
我有两个特定的 C#编码约定,我一直在练习复杂的感觉.我很想知道人们的想法.他们是:
#1.在类之后的名称实例,它是camelCased的实例
#2:"匹配属性名称"
这是基本原理:
#1.在类之后的名称实例,它是camelCased的实例
我使用它作为命名约定的默认设置.当然,也有例外.但始终使用它可以显着提高代码清晰度和可维护性.代码如下所示:
var dataConnection = new DataConnection();
//not: var dataConn, dbConn, sqlConn, myDbPickOfTheDay etc.
FileInfo fileInfo = new FileInfo();
Timer timer = new Timer();
//etc.
Run Code Online (Sandbox Code Playgroud)
我正处于这样的代码导致我身体疼痛的地步:
DataConnection dbConn = new DataConnection();
Run Code Online (Sandbox Code Playgroud)
我不能强调这个约定如何消除变量名称游戏的痛苦和愤怒.
这种惯例与试图以试图表明实例正在做什么的方式命名事物形成鲜明对比,这相当于试图创造性地将业务案例嵌入代码中.代码有一种方法可以重构到这些原始名称最多会产生误导的程度.
对我来说,这个惯例是黄金.它还可以防止对同一件事略微调整变量名的可怕做法.
实践中该惯例的一个例子是:
class Person { ...
public string FirstName { get; set; }
//and then
var person = new Person();
person.FirstName = firstName; //where firstName comes from somewhere else.
Run Code Online (Sandbox Code Playgroud)
很容易阅读.很无聊.在维护代码方面,无聊很有用.
但是,这个惯例引导我到#2:
#2"匹配属性名称"(缺少更好的标题)
这是一个例子:
public class ShoppingCart { …Run Code Online (Sandbox Code Playgroud) 我需要阅读AutoCAD导出到PDF的计划,并使用PDFBox在其上放置一些带有文本的标记.一切正常,除了计算文本的宽度,这是在标记旁边写的.
我浏览了整个PDF规范,详细阅读了处理图形和文本的部分,但无济于事.据我所知,字形坐标空间设置在用户坐标空间的1/1000.因此,宽度需要按比例增加1000,但它仍然是实际宽度的一小部分.
这就是我正在做的定位文本:
float textWidth = font.getStringWidth(marker.id) * 0.043f;
contentStream.beginText();
contentStream.setTextScaling(1, 1, 0, 0);
contentStream.moveTextPositionByAmount(
marker.endX + marker.getXTextOffset(textWidth, fontPadding),
marker.endY + marker.getYTextOffset(fontSize, fontPadding));
contentStream.drawString(marker.id);
contentStream.endText();
Run Code Online (Sandbox Code Playgroud)
*0.043f作为一个文档的近似值,但下一个文档失败.我需要重置除文本矩阵之外的任何其他变换矩阵吗?
编辑:一个完整的想法示例项目是在github与测试和示例pdfs:https://github.com/ascheucher/pdf-stamp-prototype
谢谢你的帮助!
c# ×5
java ×3
wpf ×3
mvvm ×2
dependencies ×1
file-io ×1
ibm-mq ×1
interface ×1
jar ×1
java-ee ×1
pdfbox ×1
properties ×1
refactoring ×1
reflection ×1
structuremap ×1
websphere ×1