小编Ser*_*ero的帖子

命令对象模式想要还是真实的东西?

命令对象模式是我仍然无法真正掌握的模式,我在目前正在编写的代码中找到了一个实现,因此我研究了很长时间并且很难看到我是否能够在现实世界中获得它例.问题是,我确信这没有得到正确实施,只是一个刚刚阅读过它的人尝试并认为这里有意义.

请允许我向您展示(出于保密原因,它将大大简化,但我会尽力展示主要概念):

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)

c# design-patterns

6
推荐指数
1
解决办法
1692
查看次数

注入存储库上的IDisposable

我有以下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)

c# ado.net dependency-injection idisposable

6
推荐指数
1
解决办法
1354
查看次数

使用xslt添加具有静态值的属性

我需要使用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,我真的需要一些帮助.

谢谢.

xslt

5
推荐指数
1
解决办法
8555
查看次数

创建在自定义模拟类中返回IDisposable的方法

我正在尝试教育一些人使用真实单元测试,因为他们的大部分自动化测试都是集成测试.

为了做到这一点,我想重构一个类,以便我可以在没有依赖的情况下单独测试它.

为此,我有以下限制:
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中,但我对此测试该功能并不感兴趣.

希望这澄清了意图.

c# unit-testing

5
推荐指数
1
解决办法
2059
查看次数

在Asp .Net MVC组合根中配置IoC容器的最佳实践

我正在构建一个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)

现在这个代码可以工作了(虽然我可能在某个地方犯了错误,因为我是通过内存写的),依赖关系正在解决,并且正确的控制器每次都使用正确的依赖关系进行实例化,但似乎每个请求正在配置容器以解析当时需要的依赖项.所以我的问题是:

  • 这不是多余的吗?
  • 不应该在Global.asax中完成容器的配置,所以它只进行一次?如果是这样,怎么办呢?
  • 通过按照我的方式配置容器,对象生命周期将如何受到影响?我的意思是,最终会有应该具有单例生存期的存储库,其他一些应该通过HTTP请求创建一次,因此也是如此.可能是什么影响?

任何评论,想法和/或建议将不胜感激.

顺便说一句,我正在使用的IoC容器是StructureMap,虽然我认为对于这个特定的问题,它可能不太相关.

c# dependency-injection inversion-of-control

5
推荐指数
1
解决办法
1278
查看次数

有没有办法在ac#谓词中进行这种转换

我正在尝试创建一个泛型方法,它将返回一个谓词来查找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,另一个转换为十进制.我真的不希望有这种重复.

c# generics linq-to-xml

5
推荐指数
1
解决办法
331
查看次数

在注入之前在工厂内调用类的初始化方法是一个很好的设计选项

我正在重构相当大部分的意大利面条代码.简而言之,它是一个很大的"上帝之类"类,根据某些条件分为两个不同的过程.这两个过程都很冗长,并且有很多重复的代码.

所以我的第一个努力就是将这两个进程提取到他们自己的类中,并将公共代码放在他们都继承的父代中.

它看起来像这样:

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方法中进行数据库访问的对象不是一个好的设计.

是否有任何指导方针,最佳做法或某些事情表明这实际上是一个坏主意?

谢谢你的帮助.

c# refactoring factory-pattern

5
推荐指数
1
解决办法
123
查看次数

将INNER JOINS中的几个ON子句放在一起意味着什么

我偶然发现了在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旁边?

感谢你能解开这个"神秘"的任何光明:)

t-sql sql-server sql-server-2005

5
推荐指数
1
解决办法
120
查看次数

Automapper:无法为集合创建抽象类型的实例

我试图将从抽象基类继承的具有多对多关系的两个实体映射到也从其自己的抽象基类继承的 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)

c# automapper

5
推荐指数
1
解决办法
4619
查看次数

offset()未定义,但==或===不这么认为

我们使用的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 !!

有谁知道为什么会这样,以及我们如何才能最好地处理它?

谢谢.

javascript jquery undefined

4
推荐指数
2
解决办法
433
查看次数