我试图找出如何在抽象类或接口中无法使用静态方法来解决问题时遇到一些问题.请考虑以下代码.我有许多从AbsWizard继承的向导.每个向导都有一个方法GetMagic(字符串拼写),它只返回某些魔术字的魔法,但特定类型的向导的所有实例都响应同一组魔术字.
public abstract class AbsWizard
{
public abstract Magic GetMagic(String magicword);
public abstract string[] GetAvalibleSpells();
}
public class WhiteWizard : AbsWizard
{
public override Magic GetMagic(string magicword)
{
//returns some magic based on the magic word
}
public override string[] GetAvalibleSpells()
{
string[] spells = {"booblah","zoombar"};
return spells;
}
}
public class BlackWizard : AbsWizard
{
public override Magic GetMagic(string magicword)
{
//returns some magic based on the magic word
}
public override string[] GetAvalibleSpells()
{
string[] spells = { …Run Code Online (Sandbox Code Playgroud) 我在我正在编写的应用程序中使用PropertyGrid,以允许用户查看并有时编辑对象的实例.有时用户可能在读/写模式下打开文件,他们可以通过属性网格对文件进行更改.在其他情况下,它们可能以只读模式打开文件,并且不能通过PropetyGrid对对象进行任何更改.我的类还具有通过实现ICustomTypeDescriptor返回的动态属性.这就是为什么我真的想利用PropertyGrid控件的内置灵活性.
似乎没有一种简单的方法将Property-grid设置为只读模式.如果我禁用PropertyGrid,这也会阻止用户滚动列表.所以我认为最好的方法是在运行时将ReadOnlyAttributes添加到属性中.还有其他方法吗?
我在开发项目中使用SVN的经验很少,而在关系数据库方面的经验也很少。我知道诸如表和SQL语句之类的基本概念,但我远非专家。
我想知道的是,是否有像SVN这样的通用版本控制类型的系统,但是它们适用于数据库而不是文件。我希望获得与SVN相同的功能,例如创建分支,创建标签并将分支合并在一起的功能。与其将修订版本号与文件存储库的版本相关联,不将其与数据库的版本相关联。
是否有任何通用的解决方案可以独立于实际的数据库模式添加这种功能?我会对与MySQL或MS SQL Server一起使用的解决方案感兴趣。
我还应该澄清一下,我正在尝试对数据(而非架构)进行版本控制。我希望架构保持不变。因此,实际上似乎我想找到一种方法来创建在每个版本的数据之间发送数据库的所有INSERT,UPDATE和DELETE请求的日志。这样,可以通过重新发送已保存到所需版本的所有SQL语句来重新创建任何版本。
我使用Trac来跟踪我的软件项目中的错误和未来的变化.Trac中的门票有一个"版本"字段,我试图找出使用该字段的最佳方法.
假设我在我的软件1.0版中发现了一系列错误.我在每个轨道中创建票证,并将它们分配给版本1.0.现在说我修复了一些错误,并添加了一些新功能并发布了1.1版本.但是一些旧的1.0漏洞仍然是1.1.我应该将相应的票证更改为1.1版,因为它们现在也存在于1.1中吗?或者我应该将它们设置为版本1.0,以便跟踪发现错误的版本,并假设旧版本中的任何打开的票证仍然存在于较新版本中?
我想开始使用单元测试,但我很难理解如何在当前项目中使用它们.
我当前的项目是一个将文件收集到"目录"中的应用程序.Catalog然后,A 可以从其包含的文件中提取信息,例如缩略图和其他属性.用户还可以使用其他自定义元数据标记文件,例如"作者"和"注释".它可以很容易地与Picasa或Adobe Lightroom等相册应用程序进行比较.
我已经将代码分离,以创建和操作Catalog一个单独的DLL,我现在要测试它.但是,我的大多数课程都不是要自己实例化的.相反,一切都发生在我的Catalog班级.例如,我无法单独测试我的File课程,因为File只能通过Catalog.
作为单元测试的替代方案,我认为编写一个运行一系列操作的测试程序会更有意义,包括创建目录,重新打开已创建的目录以及操作目录的内容.请参阅下面的代码.
//NOTE: The real version would have code to log the results and any exceptions thrown
//input data
string testCatalogALocation = "C:\TestCatalogA"
string testCatalogBLocation = "C:\TestCatalogB"
string testFileLocation = "C:\testfile.jpg"
string testFileName = System.IO.Path.GetFileName(testFileLocation);
//Test creating catalogs
Catalog catAtemp = Catalog(testCatalogALocation)
Catalog catBtemp = Catalog(testCatalogBLocation );
//test opening catalogs
Catalog catA = Catalog.OpenCatalog(testCatalogALocation);
Catalog catB = Catalog.OpenCatalog(testCatalogBLocation );
using(FileStream fs = new FileStream(testFileLocation …Run Code Online (Sandbox Code Playgroud) 我正在编写一个工具,该工具与另一个软件的 API 接口。我的工具的一部分需要生成关于通过 API 找到的各种对象的报告,我希望这些报告包含标识每个对象的简单字符串。默认情况下,我计划使用 ToString() 为每个对象生成字符串。但是,毫不奇怪,我发现此 API 中的默认 ToString() 实现不是描述性的。
最初我想用一个很长的 Switch 语句做一些类似于下面的代码的事情。尽管这很可能会变得难以控制。
public string GetAPIObjectDescrition(object obj)
{
Type t = obj.GetType();
Switch(t)
{
Case typeof(SomeAPIType):
SomeAPIType x = (SomeAPIType)obj;
return x.SomeProperty;
Case typeof(SomeOtherAPIType):
SomeOtherAPITypex = (SomeOtherAPIType)obj;
return x.SomeOtherProperty;
default:
return x.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
接下来我尝试使用扩展方法(见下面的代码)。CustomObjectDescription() 按预期工作,但是当我尝试调用 ToString() 时,它只返回默认的 ToString() 结果。我以前从未使用过扩展方法,所以我可能完全不相信这样的事情甚至是可能的。
我不能保证 API 中遇到的每个类型都有一个 CustomObjectDescription() 扩展,所以如果我走这条路,我最终每次都不得不使用反射来检查当前对象是否有一个 GetObjectDescription() 扩展. 如果可能,我想避免使用反射。
public static class APIObjectDescriptionExtensions
{
public static string ToString(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID …Run Code Online (Sandbox Code Playgroud) 最近我一直在努力学习ASP.NET.我已经浏览了ASP.NET网站上的教程,但在大多数情况下,我是一个完整的初学者.我也一直致力于创建一个个人网站,我选择使用CMS Umbraco,因为它基于ASP.NET.
现在我的问题并不是特定于ASP或Umbraco.它可以应用于PHP和Drupal或任何其他网站框架和CMS.我想知道何时以及为什么要使用现有的CMS技术(Umbraco,Drupal等)创建网站,以及何时应该使用像ASP.NET这样的基础Web应用程序框架从"临时"创建网站, PHP,JSP等..
我正在开发一个生成节点树结构的应用程序.有许多类型的节点,每个节点都有特定的行为和属性.我想将每个节点类型的属性包括显示名称,描述和16x16图标.
这是我创建的自定义属性的代码:
public class NodeTypeInfoAttribute : Attribute
{
public NodeTypeInfoAttribute(string displayName, string description, System.Drawing.Image icon)
: this(displayName, description)
{
this.Icon = icon;
}
public NodeTypeInfoAttribute(string displayName, string description, string iconPath):this(displayName,description)
{
String absPath;
if (System.IO.Path.IsPathRooted(iconPath))
{
absPath = iconPath;
}
else
{
string folder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
absPath = System.IO.Path.Combine(folder, iconPath);
}
try
{
System.Drawing.Image i = System.Drawing.Image.FromFile(absPath);
}
catch (System.IO.FileNotFoundException)
{
Icon = null;
}
}
public NodeTypeInfoAttribute(string displayName, string description)
{
this.DisplayName = displayName;
this.Description = description;
}
public …Run Code Online (Sandbox Code Playgroud) 我是ASP.NET的新手,刚刚开始学习ASP.NET MVC 3.我使用默认模板启动了一个新的ASP.NET MVC 3项目,该模板已经配置了大部分成员资格.现在我正试图了解幕后的真实情况.
我发现默认模板定义了一个IMembershipService接口,该接口由AccountMembershipService类实现,它基本上只包装System.Web.Security.MembershipProvider.从代码中的注释听起来像这样的抽象是为了便于单元测试.
默认的MembershipProvider在Web.config文件中设置.我的项目是从默认模板创建的,它被设置为SqlMembershipProvider.
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
它引用Web.config文件中的连接字符串,该文件引用SQL Express数据库"aspnetdb.mdf".
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
当我第一次创建项目时,没有aspnet.mdf文件.但在运行我的应用程序并注册新用户后,此文件自动生成表格和所有.这里发生了什么?是什么创建了这个文件并指定了应该创建的表?
我试图了解如何对通过某种存储库访问数据的ASP.NET MVC项目进行单元测试.
在单元测试中,我显然想创建一个模拟存储库但是如何将这个模拟存储库传递给正在测试的Controller实例?另外,真正连接到数据库的实际存储库如何找到控制器的路径?
我是通过构造函数简单地执行此操作,如下所示?我认为这是我应该如何设置我的控制器,但我想确认这是正确的:
public class SampleController : Controller
{
private IRepository _repo;
//Default constructor uses a real repository
// new ConcreteRepo() could also be replaced by some static
// GetRepository() method somewhere so it would be easy to modify
//which concrete IRepository is being used
public SampleController():this(new ConcreteRepo())
{
}
//Unit tests pass in mock repository here
public SampleController(IRepository repo)
{
_repo = repo;
}
}
Run Code Online (Sandbox Code Playgroud) asp.net-mvc unit-testing dependency-injection repository-pattern
c# ×5
.net ×3
unit-testing ×2
asp.net ×1
asp.net-mvc ×1
attributes ×1
drupal ×1
interface ×1
mysql ×1
php ×1
propertygrid ×1
readonly ×1
resources ×1
sql-server ×1
static ×1
tdd ×1
tostring ×1
trac ×1
umbraco ×1