从Delphi 2010升级后,我在Delphi XE中丢失了大部分的Library Path,
现在即使是一些简单的应用程序也无法编译.
有没有办法恢复库路径中丢失的目录条目?
编辑:我发现了一个令人惊讶的解决方案,只需删除此注册表项:
HKEY_CURRENT_USER\SOFTWARE\Embarcadero公司\ BDS\8.0 \图书馆
并重新启动Delphi,然后将使用正确的默认值再次生成注册表中的密钥,但您将失去任何第三方,至少现在它正在工作!
我希望它对任何有同样问题的人都有用:)
我的应用程序中有多个业务对象(C#、Winforms、WinXP)。当用户在 UI 上执行某些操作时,这些对象中的每一个都会被应用程序的不同部分修改和更新。每次修改后,我需要首先检查发生了什么变化,然后记录对对象所做的这些更改。记录此内容的目的是创建对应用程序中正在进行的活动的全面跟踪。
这些对象中的许多包含其他对象的列表,并且这种嵌套可以有几个级别深。任何解决方案的 2 个主要要求是
- 尽可能准确地捕捉变化
- 将性能成本保持在最低水平。
例如一个业务对象:
public class MainClass1
{
public MainClass1()
{
detailCollection1 = new ClassDetailCollection1();
detailCollection2 = new ClassDetailCollection2();
}
private Int64 id;
public Int64 ID
{
get { return id; }
set { id = value; }
}
private DateTime timeStamp;
public DateTime TimeStamp
{
get { return timeStamp; }
set { timeStamp = value; }
}
private string category = string.Empty;
public string Category
{
get { return category; }
set { category …Run Code Online (Sandbox Code Playgroud) 上下文:在.NET平台上构建智能客户端应用程序,其中包含涉及大量列的复杂数据库模型.自然的应用程序风格是典型的数据驱动CRUD.在某些情况下,还有一些服务器端逻辑,以及一些复杂的验证.您可以完全控制客户端和服务器,因此对互操作性的需求至少是必需的.
这个问题有很多细节,为此道歉,但这是因为我想为答案设置适当的背景.
还有一些假设
- 在微软世界中并不罕见,大多数以前的应用程序都是用DataSet编写的,因此它是所涉及开发人员最熟悉的技术.但是,让我们说开发人员也非常精通OO思维.
- 您需要在客户端和服务器上运行验证.
- 您不以表格形式显示大多数数据.
- 这不是内联网应用程序,因此您不能过多地考虑带宽
最大的问题:数据集还是对象?
如果你选择数据集,你会有一些积极的和消极的
- 在积极方面:你从数据库中获取数据,通过网络获取数据并通过网络返回更改的数据方面获得了一些Microsoft支持较小的块 - 因为您只能指定发送更改.发送较少的数据是好的,因为可能涉及相当多的数据.
- 否定的是:在验证,业务逻辑等方面,你得到了一个程序化的代码形式,你没有得到面向对象代码的好处 - 行为和数据在一起,更自然的工作和思考方式你正在做什么,可能更接近验证逻辑.您还可以放弃将数据集放在网格中的好处,因为这不是常见的用例.
如果你去寻找对象,那就是同样的练习,但还有更多的选择:
肯定:行为和数据在一起.验证逻辑更接近.更容易查看和理解对象之间的关系.更易读的代码.更容易进行单元测试.但是,您还需要做很多选择和工作:
OR/Mapping
- 从关系模型获取数据到对象.OR映射器并不复杂,并且能够很好地处理它.但它增加了开发时间.
合同映射
- 将数据从服务器端对象映射到合同对象(通常是DTO)通常是一种很好的做法.由于这是一个非常适合CRUD风格架构的应用程序,因此DTO并没有真正为图片增加太多价值,只是映射工作.
共享代码
- 您可以使用共享代码方案,其中包含域数据和逻辑的程序集在客户端和服务器端都可用.这是紧密耦合,但当你有一个自然紧密耦合的客户端 - 服务器应用程序时,它并不一定是坏的.
无论您选择是否添加合同层,您都必须通过线路发送大型对象结构因为我们控制客户端和服务器,所以传输和编码应该是TCP上的二进制编码.那会有所帮助.使用数据集,您可以选择仅发送更改.前后发送整个对象结构可能是性能问题.发送整个对象结构的选项是以某种方式识别所涉及的更改(创建,更新,删除),并仅发送有关该更改的信息.理论上,将聚合根ID发送到服务器以及更改并不太难,要求服务器延迟加载聚合根,执行所做的更改,然后再次保存.但涉及的最大复杂性是确定所做的改变.你有没有采用这种方法?为什么?你究竟是怎么做到的?
演示文稿
确切的UI技术对于这个问题并不是那么重要,WinForms,Silverlight或WPF是可能的.让我们假设我们正在使用WPF,因为它是一个新的智能客户端.这意味着我们有两种方式绑定,可以正确使用MVVM.
绑定到用户界面的对象需要实现INotifyPropertyChanged并在每次更新属性时引发事件.你是如何解决这个问题的?如果您选择共享代码方案,则可以将其添加到域对象中,但这将涉及在服务器端添加从未在那里使用的代码和逻辑.如果你去合同对象,分离是更自然的,但是添加一层映射并不是很多增值.
技术
有一些技术可以帮助解决一些问题,但这通常会使其他问题复杂化.你是使用它们,还是自己从头开始构建东西?
**
- CSLA是可能的,但它使单元测试更加困难,并且似乎为数据访问增加了更紧密的耦合.它确实对许多问题有所帮助,但我个人对这项技术没有任何能力,所以它是否适合它是有点难以说的.
- WCF RIA服务可用于Silverlight解决方案,但肯定存在限制.数据大小是一个.
- WCF数据服务是另一种快速获取内容的方法,但REST没有太大帮助,而且您还缺乏RIA服务中的验证支持.
总结
如果你已经走到这一步,我希望你能够了解我的目标.我试图将其缩小以避免一次性讨论所有内容,但分布式开发很复杂,因此您必须考虑许多部分.
更新
谢谢你们的回应!我试图提出足够开放的问题以获得不同的答案,但具体到足以处理一些不常见的要求.
有不同的考虑因素有不同的优点和缺点,并且因系统而异.每种方法通常都会增加寻找解决方案的复杂性.这个问题的一个要点是特别提出一些额外的要求,而这些要求并不是直接适合今天通常是正确的答案 - 基于任务的UI.如果你愿意,我不是一个"CRUD-guy".但是由于各种原因(通常是遗留的),一些系统非常适合CRUD.
许多商业应用程序都有类似的需求,可以引导不同的方
业务相关
- 查看:向用户显示数据并更新相同的数据(读取和CUD - 创建,更新,删除)
- 验证:业务规则
UI相关
- 验证:UI规则
- UI更新:特定于仅使UI更新对象更改的代码(INotifyPropertyChanged)
网络相关
- 数据大小:通过网络发送的数据量
DB相关
- 延迟加载
SRP /重用相关
- 映射:由多层对象/分离问题引起
维护/更改相关
- …
我正在使用PHP 5.2.6.我希望方法中的参数有一个默认值,但似乎我有点太聪明了.
class属性blnOverwrite是默认的,可以在类的其他地方设置.我有一个方法,我想让它再次设置,但不能覆盖现有的值.我尝试这个时收到错误:
public function place( $path, $overwrite = $this->blnOverwrite ) { ... }
Run Code Online (Sandbox Code Playgroud)
我必须这样做吗?
public function place( $path, $overwrite = NULL ) {
if ( ! is_null($overwrite) ) {
$this->blnOverwrite = $overwrite;
}
...
}
Run Code Online (Sandbox Code Playgroud) 这是一个奇怪的...
我正在玩一些减压算法.char buffer[]在buffer[i]找到停止位之前,我没有经过和循环 ,而是尝试使用一些位掩码技术但是使用字符.
我有以下示例:
// In a *.h file
const char ch = '\x81';
// To avoid Endianess
union CharUInt
{
char sz[4];
unsigned int u;
};
// Legal because char[] is declared before uint32 in the union
const CharUInt Mask1 = {'\x81', '\x0', '\x0', '\x81'};
const CharUInt Mask2 = {'\x0', '\x81', '\x81', '\x0'};
// Proxy / Auxillary uint32 as usimg Mask2.u in the switch blocked produced the same errors
const unsigned int uMask1 = …Run Code Online (Sandbox Code Playgroud) 在我的母版页中,我有:
MembershipUser thisUser = Membership.GetUser();
loggedInUserID = thisUser.ProviderUserKey.ToString();
Run Code Online (Sandbox Code Playgroud)
thisUser让我访问所有的字段aspnet_Membership.
我希望isSubscribed为每个用户提供一个新字段.我可以使用SQL查询来获取值,但我想知道是否有某种方法来修改成员用户对象,以便它也检索此值,因此可以从以下位置访问:
thisUser.isSubscribed.ToString();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
如果我需要在一个需要确保没有分配任何内容的情况下从一个NUL终止的char阵列中获取std::string,那么使用它是否安全c_str?例如,如果我在析构函数中并且我想将一些数据从一个复制string到预先分配的固定大小的缓冲区中,我可以使用c_str并确保它不会抛出任何东西吗?
我在哪里可以找到这门课程?我已经包含了Rx扩展.我已经确定我编译的版本是Silverlight 4.我的VS2010 IDE仍然不知道IObservable的类型是什么.
我收到一个编译错误,说"无法找到类型或命名空间IObservable"
我没有在System.Collections.Generic命名空间中看到它们,就像这个线程建议 http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions/suggestions/523437-include-iobserver-t-and-的IObservable叔接口
我错过了对dll的引用吗?
如何在不破坏封装的情况下执行依赖注入?
public Car {
public float getSpeed();
}
Run Code Online (Sandbox Code Playgroud)
注意:为清楚起见,省略了其他方法和属性(例如PushBrake(),PushGas(),SetWheelPosition())
这很好用; 你不知道我的对象getSpeed是如何实现的- 它是" 封装的 ".
实际上我的对象实现getSpeed为:
public Car {
private m_speed;
public float getSpeed( return m_speed; );
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.有人建造我的Car物体,捣碎踏板,喇叭,方向盘,汽车响应.
现在让我说我改变了我的汽车的内部实现细节:
public Car {
private Engine m_engine;
private float m_currentGearRatio;
public float getSpeed( return m_engine.getRpm*m_currentGearRatio; );
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.将Car是继二OO正确的原则,隐藏的细节如何采取某些措施.这使得呼叫者可以解决他的问题,而不是试图了解汽车的工作原理.它还让我可以自由地改变我的实现.
但依赖注入会迫使我将我的类暴露给Engine我没有创建或初始化的对象.更糟糕的是,我现在已经暴露了我Car甚至有一个引擎:
public Car {
public constructor(Engine engine);
public float getSpeed();
}
Run Code Online (Sandbox Code Playgroud)
现在,外面的词语意识到我使用的是 …
language-agnostic oop unit-testing encapsulation dependency-injection
.net ×2
c# ×2
c++ ×2
architecture ×1
asp.net ×1
audit ×1
crud ×1
data-driven ×1
database ×1
default ×1
delphi ×1
delphi-xe ×1
distributed ×1
enterprise ×1
javascript ×1
jquery ×1
observable ×1
oop ×1
php ×1
string ×1
unit-testing ×1