在我的应用程序中,我的存储库需要将不同的参数传递给具体类型的构造函数。我希望能够做到这样的事情:
var arg = (x == y) ? z : a;
ObjectFactory.GetInstance<IRepository>(arg);
只能根据某些条件在创建Repository实例时构造参数。
如何做到这一点?
答案 0 :(得分:7)
正如@Steven所说,我认为如果可能的话,你应该让需要依赖的类(具有动态参数)将工厂作为参数,以便你可以控制消费者的创建。
对于结构图,内置了对此的支持,因此您没有构建工厂类。
让消费者将Func作为ctor参数,并通过使用参数调用Func来创建存储库(依赖项):
public class Consumer
{
public Consumer(Func<ArgumentType, IRepository> repositoryFactory)
{
_repositoryFactory = repositoryFactory;
}
public void CallRepository()
{
ArgumentType arg = (x == y) ? z : a;
var repository = _repositoryFactory(arg);
repository.GetById(...);
}
}
在结构图的配置中,您可以配置func:
For<Func<ArgumentType, IRepository>>().Use( arg => new Repository(arg));
答案 1 :(得分:1)
我认为这样的事情应该有效:
var arg = (x == y) ? z : a;
ObjectFactory.With("argumentName").EqualTo(arg).GetInstance<IRepository>();
答案 2 :(得分:1)
创建IRepositoryFactory
并注册并解决该问题,而不是解析IRepository
。这将使您不必直接从应用程序中调用容器。这应该是prevented不惜一切代价。