我有一个需要有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根据传递给构造函数的参数选择正确的构造函数(即使用常规方法重载)。
答案 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));
}
}