我的 GeneralRegistry 中有这个配置:
ForRequestedType<IClientBonusHistoryLoadTask>().AlwaysUnique().TheDefaultIsConcreteType<ClientBonusHistoryLoadTask>();
我有这个代码:
public ClientAdvantagesUpdateTask(IBaseRepo<Client> repository, INHUnitOfWorkProvider uowProvider, IClientBonusHistoryLoadTask clientBonusHistoryLoadTask, ClientBonusHistoryLoadTask masterClientBonusHistoryLoadTask) : base(repository, uowProvider)
{
_clientBonusHistoryLoadTask = clientBonusHistoryLoadTask;
_masterClientBonusHistoryLoadTask =
masterClientBonusHistoryLoadTask;
bool y = clientBonusHistoryLoadTask.Equals
(masterClientBonusHistoryLoadTask);
var task = ObjectFactory.GetInstance<IClientBonusHistoryLoadTask>
();
var task2 =
ObjectFactory.GetInstance<IClientBonusHistoryLoadTask>();
bool x = task.Equals(task2);
}
出于某种原因,y 为真(这是问题所在)而 x 为假
(按预期工作)。这是一个错误,还是我在做什么
错误的?
最佳答案
嗨,我有同样的问题,总是独一无二的并不是让它总是独一无二的。
但是几乎没有文档知道它应该做什么。
我使用以下内容:
For<ILeadRepository>().Use<LeadRepository>();
然后在对象工厂方法中:
LeadRepository instance = ioc.GetInstance<LeadRepository>();
ioc.Inject(typeof(ILeadRepository), instance);
ioc.Inject(typeof(LeadRepository), instance);
其中 ioc 是
IContainer
.同样,我不确定 Inject 是否应该这样使用,但这总是一样的
运行注入(inject)代码后,将 LeadRepository 实例从 ioc 容器中取出。
希望这会有所帮助,或者有人可以发布应该如何完成的信息。
我不喜欢使用静态工厂或静态方法,所以我创建了自己的工厂,并且该工厂内的所有内容都使用上面的代码从 ioc 容器中提取出唯一的实例。
假设您想要一个唯一的实例,即每个工厂一个单例。
并且您总是希望返回相同的实例。我找到了一种更好的方法,那就是在工厂中使用子容器:
例如
myParentContainer = new Container(x => {
x.AddRegistry<ObjectFactoryModelRegistry>();
x.AddRegistry<ServiceRegistry>();
});
myIoc = myParentContainer.GetNestedContainer();
myIoc.AssertConfigurationIsValid();
然后可以使用以下代码获取相同的实例:
myIoc.GetInstance<T>;
关于StructureMap AlwaysUnique 似乎不适用于构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1318299/