Structuremap构造函数重载

时间:2011-08-05 11:15:04

标签: structuremap

我有一个需要有2个构造函数的命令类。然而, 使用structuremap似乎我只能指定一个构造函数 使用。我现在通过对具体的子类型进行子类型化解决了这个问题 命令类,每个实现都实现它自己的命令类 接口和构造函数。如下面的代码所示。该 ISelectCommand实现了两个独立的接口 字符串构造函数和int构造函数,只是为了 使用structuremap注册两个子类型。

但是,我认为这是一个黑客,我只是想知道为什么不是 可以通过结构图解析构造函数签名 类型作为构造函数的参数传入?然后我可以注册 SelectProductCommand作为ISelectCommand和 实例化它像: ObjectFactury.With(10)。用>(); 。orObjectFactury.With( “testproduct”)用途>();

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)) {}
}

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

2 个答案:

答案 0 :(得分:1)

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

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

如果我没有弄错的话,你在这里使用命令进行查询。你也有一些关注点分离的问题。发布的命令定义了要做什么以及如何做,这是很多,你得到你正在使用的那种服务位置

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

我构造命令的方法是使用CreateProductCommand作为数据协定,即它只包含产品信息等数据。 然后,您有一个CreateProductCommandHandler,它使用单个方法IHandles<CreateProductCommand>Handle实现Execute。通过这种方式,您可以更好地分离关注点和可测试性。

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

答案 1 :(得分:1)

我认为我使用一个小实用程序类解决了这个问题。此类从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));
    }
}