命令对象模式是我仍然无法真正掌握的模式,我在目前正在编写的代码中找到了一个实现,因此我研究了很长时间并且很难看到我是否能够在现实世界中获得它例.问题是,我确信这没有得到正确实施,只是一个刚刚阅读过它的人尝试并认为这里有意义.
请允许我向您展示(出于保密原因,它将大大简化,但我会尽力展示主要概念):
public class CommandOne
{
public CommandOne(Manager manager, MyForm form)
{
m_manager = manager;
m_form = form;
}
public void Execute()
{
m_manager.CommandOne(m_form);
}
}
public class CommandTwo
{
public CommandTwo(Manager manager, MyForm form)
{
m_manager = manager;
m_form = form;
}
public void Execute()
{
m_manager.CommandTwo(m_form);
}
}
Run Code Online (Sandbox Code Playgroud)
令我感到奇怪的第一件事是这两个类不是从任何抽象类继承,也不是实现公共接口.
使用这些命令的代码如下:
public class MyForm : System.Windows.Forms.Form
{
public MyForm(Manager manager)
{
m_manager = manager;
}
private void SomeMethod()
{
....
var cmd = new CommandOne(manager, this);
cmd.Execute();
...
} …Run Code Online (Sandbox Code Playgroud) 我有以下ADO .Net存储库
public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;
public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}
public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}
Run Code Online (Sandbox Code Playgroud)
此存储库向IOS容器注入域服务,使用方式如下:
public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;
public UserDomainService(IRepository repository)
{
Repository = repository;
}
public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!"); …Run Code Online (Sandbox Code Playgroud) 我需要使用xslt将具有静态值的属性添加到现有xml文件中特定类型的所有节点.基本上是这样的:
<root>
<somenode att1="something" />
<mynode id="1" att1="value1" att2="value2"/>
<mynode id="2" att1="value3" att2="value4"/>
</root>
Run Code Online (Sandbox Code Playgroud)
我需要它像这样:
<root>
<somenode att1="something" />
<mynode id="1" att1="value1" att2="value2" newatt="static string"/>
<mynode id="2" att1="value3" att2="value4" newatt="static string"/>
</root>
Run Code Online (Sandbox Code Playgroud)
我看了一下这个答案,但是如果它可以用于我正在尝试的东西,我就无法使用它.
我之前从未使用过xslt,我真的需要一些帮助.
谢谢.
我正在尝试教育一些人使用真实单元测试,因为他们的大部分自动化测试都是集成测试.
为了做到这一点,我想重构一个类,以便我可以在没有依赖的情况下单独测试它.
为此,我有以下限制:
1.我不能使用任何模拟框架,所以我必须为此创建自定义模拟.
2.我无法修改将被模拟以将任何私有方法更改为protected或public的类,或者将方法更改为virtual,因此我无法从此类继承并覆盖方法.
所以在我要测试的方法中,我有以下using语句:
using(myObject.CreateScope())
{
.... do something
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我打算做的是:
1.从myObject的类中提取一个接口.
2.使用属性注入SUT上的接口.
当然,"CreateScope"方法将是接口的一部分,其定义如下:
public IDisposable CreateScope();
Run Code Online (Sandbox Code Playgroud)
所以在我的自定义模拟我想做的事情如下:
public IDisposable CreateScope()
{
return new AnyDisposableObject();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
考虑到单独测试类的消息提供了集成测试所不能提供的许多好处,那么在自定义模拟中实现"CreateScope"方法的最不痛苦和最清晰的方法是什么?
我应该创建一个空虚假对象,其唯一目的是实现IDisposable吗?
我应该使用实现IDisposable的.Net框架中的任何对象吗?
有没有比上面两个选项更好的方法?
提前致谢.
更新:为了清楚起见
using(myObject.CreateScope())
{
var local = parameter.Where(o => !myObject.Contains(o)).Select(o).ToList();
...
myObject.Register(newInstance);
...
return myObject.GetList();
}
Run Code Online (Sandbox Code Playgroud)
我将在"using"语句中测试逻辑.myObject对象将被模拟,只是为了在调用返回它们的方法时提供值,或者为void属性提供空方法.CreateScope方法的作用是将锁定置于受保护的Dictionary中,但我对此测试该功能并不感兴趣.
希望这澄清了意图.
我正在构建一个ASP .Net MVC 2应用程序,我想按照Mark Seemann的书".Net中的依赖注入"中的想法,所以我在Global.asax文件中注册了我的自定义控制器工厂,我在内部配置容器控制器工厂如下:
public IController CreateController(RequestContext context, Type controllerType)
{
var container = new Container();
object controller;
if(controllerType == typeof(MyControllerOne)
{
container.Configure(r => r.
For<IService>().
Use<ServiceOne>());
}
else if(controllerType == typeof(MyControllerTwo)
{
container.Configure(r => r.
For<IService>().
Use<ServiceTwo>());
}
......
return container.GetInstance(controllerType) as IController;
}
Run Code Online (Sandbox Code Playgroud)
现在这个代码可以工作了(虽然我可能在某个地方犯了错误,因为我是通过内存写的),依赖关系正在解决,并且正确的控制器每次都使用正确的依赖关系进行实例化,但似乎每个请求正在配置容器以解析当时需要的依赖项.所以我的问题是:
任何评论,想法和/或建议将不胜感激.
顺便说一句,我正在使用的IoC容器是StructureMap,虽然我认为对于这个特定的问题,它可能不太相关.
我正在尝试创建一个泛型方法,它将返回一个谓词来查找XML文档中的元素.
基本上是这样的:
private static Func<XElement, bool> GetPredicate<T>(Criterion criterion)
{
switch (criterion.CriteriaOperator)
{
case CriteriaOperator.Equal:
return x => (T)x.Attribute(criterion.PropertyName) ==
(T)(criterion.PropertyValue);
case CriteriaOperator.GreaterThan:
return x => (T)x.Attribute(criterion.PropertyName) >
(T)(criterion.PropertyValue);
case CriteriaOperator.GreaterThanOrEqual:
return x => (T)x.Attribute(criterion.PropertyName) >=
(T)(criterion.PropertyValue);
case CriteriaOperator.LessThan:
return x => (T)x.Attribute(criterion.PropertyName) <
(T)(criterion.PropertyValue);
case CriteriaOperator.LessThanOrEqual:
return x => (T)x.Attribute(criterion.PropertyName) <=
(T)(criterion.PropertyValue);
case CriteriaOperator.NotEqual:
return x => (T)x.Attribute(criterion.PropertyName) !=
(T)(criterion.PropertyValue);
default:
throw new ArgumentException("Criteria Operator not supported.");
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是这不能编译.问题出(T)x.Attribute(criterion.PropertyName)在编译器指示的部分:
无法将类型为"System.Xml.Linq.XAttribute"的表达式转换为"T"
目前我有两个相同的方法,除了一个转换为double,另一个转换为十进制.我真的不希望有这种重复.
我正在重构相当大部分的意大利面条代码.简而言之,它是一个很大的"上帝之类"类,根据某些条件分为两个不同的过程.这两个过程都很冗长,并且有很多重复的代码.
所以我的第一个努力就是将这两个进程提取到他们自己的类中,并将公共代码放在他们都继承的父代中.
它看起来像这样:
public class ExportProcess
{
public ExportClass(IExportDataProvider dataProvider, IExporterFactory exporterFactory)
{
_dataProvider = dataProvider;
_exporterFactory = exporterFactory;
}
public void DoExport(SomeDataStructure someDataStructure)
{
_dataProvider.Load(someDataStructure.Id);
var exporter = _exporterFactory.Create(_dataProvider, someDataStructure);
exporter.Export();
}
}
Run Code Online (Sandbox Code Playgroud)
我是Mark Seemann博客的狂热读者,在这篇文章中他解释说这段代码具有时间耦合气味,因为在数据提供程序处于可用状态之前必须调用Load方法.
基于此,并且由于对象被注入到工厂返回的对象中,我正在考虑更改工厂来执行此操作:
public IExporter Create(IExportDataProvider dataProvider, SomeDataStructure someDataStructure)
{
dataProvider.Load(someDataStructure.Id);
if(dataProvider.IsNewExport)
{
return new NewExportExporter(dataProvider, someDataStructure);
}
return new UpdateExportExporter(dataProvider, someDataStructure);
}
Run Code Online (Sandbox Code Playgroud)
由于名称"DataProvider",您可能猜到Load方法实际上正在进行数据库访问.
有些东西告诉我在抽象工厂的create方法中进行数据库访问的对象不是一个好的设计.
是否有任何指导方针,最佳做法或某些事情表明这实际上是一个坏主意?
谢谢你的帮助.
我偶然发现了在SQL Server 2005数据库上创建的这个T-SQL查询:
Select s_bs.ScheduleHeaderId,
s_bs.ScheduleBatchScheduleId,
FlowRateOperational.FlowRate,
BatchScheduleFlowRateOperational.EffectiveStartTime,
BatchScheduleFlowRateOperational.EffectiveEndTime
From BatchSchedule as bs
Inner Join ConnectionPoint as cp on bs.ConnectionPointId = cp.ConnectionPointId
Inner Join ScheduleBatch as s_b
Inner Join ScheduleConnectionPoint as s_cp
Inner Join ScheduleBatchSchedule as s_bs
on s_cp.ScheduleConnectionPointId = s_bs.ScheduleConnectionPointId
on s_b.ScheduleBatchId = s_bs.ScheduleBatchId
on cp.ConnectionPointName = s_cp.ConnectionPointName and bs.BatchID = s_b.BatchID
Inner Join BatchScheduleFlowRateOperational on bs.BatchScheduleId = BatchScheduleFlowRateOperational.BatchScheduleId
Inner Join FlowRateOperational on BatchScheduleFlowRateOperational.FlowRateOperationalId = FlowRateOperational.FlowRateOperationalId
Run Code Online (Sandbox Code Playgroud)
到目前为止我不是SQL专家,但至少我认为我知道如何连接表,我以前从未见过这种连接表的方式.
在他们的JOINS产生不同的结果或提高性能后,有几个ON条款?
为什么这个人只能移动连接并将ON子句保持在相应的JOIN旁边?
感谢你能解开这个"神秘"的任何光明:)
我试图将从抽象基类继承的具有多对多关系的两个实体映射到也从其自己的抽象基类继承的 Dtos 中。当我只包含Essay类的映射时,除了Books集合为空之外,一切正常,一旦我添加该集合的映射,就会出现以下异常:
内部异常 1:ArgumentException:无法创建抽象类型 Dtos.Dto`1[System.Int64] 的实例。
考虑以下代码:
namespace Entities
{
public abstract class Entity<TId> : Entity
where TId : struct, IEquatable<TId>
{
protected Entity()
{
}
public TId Id { get; set; }
}
public class Essay : Entity<long>
{
public string Name { get; set; }
public string Author { get; set; }
public List<EssayBook> EssayBooks { get; set; }
}
public class Book : Entity<long>
{
public string BookName { get; set; } …Run Code Online (Sandbox Code Playgroud) 我们使用的jQuery版本是1.10.2.
在特定的屏幕上,我们使用jQuery获取DOM元素并尝试获取其offset()对象.有时可能不会显示该对象,并且根据jQuery文档,在这种情况下,不支持offset().
这一切都很好,但是,如果我尝试检查offset()对象是否与undefined不同,代码总是在条件内部,那么为什么我的头部旋转真的是为什么?
我的代码(由于保密协议而简化)如下:
var isCurrent = $('.detail-current[value=\'true\']:first');
if (isCurrent != 'undefined') {
var button = isCurrent.closest('.batch-item').find('.batch-item-top').find('input[name=\'edit\']');
var myOffsetTop = 0;
if(button.offset() != 'undefined')
myOffsetTop = button.offset().top;
$('html, body').animate({
scrollTop: myOffsetTop - 50
});
}
Run Code Online (Sandbox Code Playgroud)
当我使用IE开发工具调试时,我在控制台上看到button.offset()未定义但是button.offset()!= undefined返回true !!
有谁知道为什么会这样,以及我们如何才能最好地处理它?
谢谢.
c# ×7
ado.net ×1
automapper ×1
generics ×1
idisposable ×1
javascript ×1
jquery ×1
linq-to-xml ×1
refactoring ×1
sql-server ×1
t-sql ×1
undefined ×1
unit-testing ×1
xslt ×1