【问题标题】:Structuremap constructor overloadingStructuremap 构造函数重载
【发布时间】:2011-08-05 11:15:04
【问题描述】:

我有一个需要有 2 个构造函数的命令类。然而, 使用结构映射似乎我只能指定一个构造函数 使用。我现在已经通过子类型化特定的方式解决了这个问题 命令类,每个实现都有自己的 接口和构造函数。就像下面的代码所示。这 ISelectCommand 为 字符串构造函数和 int 构造函数,只是为了 使用结构映射注册两个子类型。

但是,我认为这是一种 hack,我只是想知道为什么不是 结构映射可以通过 作为构造函数的参数传入的类型?那我就可以注册了 SelectProductCommand 作为 ISelectCommand 和 像这样实例化它: ObjectFactory.With(10).Use>(); orObjectFactury.With("testproduct").Use>();

public class SelectProductCommand : ISelectCommand<IProduct>,
ICommand, IExecutable
{
   private readonly Func<Product, Boolean> _selector;
   private IEnumerable<IProduct> _resultList;

   public SelectProductCommand(Func<Product, Boolean> selector)
   {
       _selector = selector;
   }

   public IEnumerable<IProduct> Result
   {
       get { return _resultList; }
   }

   public void Execute(GenFormDataContext context)
   {
       _resultList = GetProductRepository().Fetch(context,
_selector);
   }

   private Repository<IProduct, Product> GetProductRepository()
   {
       return ObjectFactory.GetInstance<Repository<IProduct,
Product>>();
   }
}

public class SelectProductIntCommand: SelectProductCommand
{
    public SelectProductIntCommand(Int32 id): base(x =>
 x.ProductId == id) {}
}

public class SelectProductStringCommand: SelectProductCommand
{
    public SelectProductStringCommand(String name): base(x =>
x.ProductName.Contains(name)) {}
}

附:我知道如何告诉结构映射使用什么构造函数映射,但我的问题是,是否有办法让结构映射根据传递给构造函数的参数选择正确的构造函数(即使用常规方法重载)。

【问题讨论】:

    标签: structuremap


    【解决方案1】:

    简短的回答是this post by the creator of Structuremap

    长答案是关于你在那段代码中的结构。在我看来,根据定义,命令是对“实体”执行某些操作的“类”,即它以某种方式修改了类。想想 CreateNewProductCommand。

    如果我没记错的话,您在这里使用的是查询命令。您还有一些关注点分离问题。发布的命令定义了要做什么和如何做,这太多了,你会得到你在

    中使用的那种服务位置
    private Repository<IProduct, Product> GetProductRepository()
    {
        return ObjectFactory.GetInstance<Repository<IProduct, Product>>();
    }
    

    我构建命令的方式是使用 CreateProductCommand 作为数据合约,即它只包含产品信息等数据。 然后你有一个 CreateProductCommandHandler,它使用单个方法 HandleExecute 实现 IHandles&lt;CreateProductCommand&gt;。这样您就可以更好地分离关注点和可测试性。

    至于查询部分,直接在你的控制器/演示器中使用你的存储库,或者使用Query Object pattern

    【讨论】:

    • 这里有一些链接可以让你继续使用命令/处理程序:lostechies.com/jimmybogard/2010/01/07/…lostechies.com/derickbailey/2008/11/20/…
    • 很抱歉,但这不是我想要的答案。我知道你提到的杰里米米勒的帖子。但正如我所提到的,这仅与事先指定特定的构造函数有关。至于命令模式上的 cmets,谢谢,我会调查的。但是,您应该意识到命令类(可能命名不合适)只是从存储库中获取产品的选择方法的包装器。我也有插入、删除和更新命令。此设置的目的是我可以将它们添加到传递给事务管理器的命令列表中。
    【解决方案2】:

    我想我使用一个小型实用程序类解决了这个问题。该类从 ObjectFactory 中获取具体类型,并使用该类型根据过去传入工厂方法的参数构造实例。现在在“客户端”端,我使用 ObjectFactory 创建 CommandFactory 的一个实例。 CommandFactory 的实现在另一个解决方案中,因此“客户端解决方案”保持独立于“服务器”解决方案。

    public class CommandFactory
    {
    
        public ICommand Create<T>()
        {
            return Create<T>(new object[] {});
        }
    
        public ICommand Create<T>(object arg1)
        {
            return Create<T>(new[] {arg1});
        }
    
        public ICommand Create<T>(object arg1, object arg2)
        {
            return Create<T>(new[] {arg1, arg2});
        }
    
        public ICommand Create<T>(object arg1, object arg2, object arg3)
        {
            return Create<T>(new[] {arg1, arg2, arg3});
        }
    
        public ICommand Create<T>(object[] arguments)
        {
            return (ICommand)Activator.CreateInstance(GetRegisteredType<T>(), arguments);
        }
    
        public static Type GetRegisteredType<T>()
        {
            return ObjectFactory.Model.DefaultTypeFor(typeof (T));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多