注意:为了澄清,这个问题不是关于在 MVC 控制器中设置 IoC,而是在它们之外。
我的控制器中的 IoC 工作正常,但是我需要让它在自定义类中的控制器之外工作(在使用 CacheBuilders 列表来构建缓存的 CacheManager 类中)。
为此,到目前为止,我将 Windsor 容器的引用传递给 CacheManager,而 CacheManager 会将其传递给每个 CacheBuilder 以解析它可能需要解析的任何引用。但是我认为这不是一个好主意,我想在不传递此参考的情况下这样做,从我读到的内容来看,我认为类型化工厂可以帮助我解决这个问题。
我创建了一个如下所示的界面...
public interface ITypeFactory
{
T Create<T>();
void Release(object value);
}
...并将其注册为 BootStrapContainer 方法中的工厂类型,该方法在 Web 应用程序启动时被触发...。
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<ITypeFactory>().AsFactory());
现在我打算在我的一个 CacheBuilders 中使用它作为以下内容......
public class CountryCacheBuilder : ICacheBuilder
{
public ITypeFactory TypeFactory { get; set; }
public void PersistToCache(Cache cache)
{
var repository = TypeFactory.Create<ICountryRepository>();
var listOfCountries = repository.GetAllCountries();
// add list of Countries to cache
}
}
...给定 ICountryRepository 定义如下....
public interface ICountryRepository
{
List<Country> GetAllCountries();
}
...在 Global.asax App_Start 方法中,我像这样向 CacheManager 注册所有 CacheBuilders ...
CacheManager.Instance.CacheBuilders.Add(new CountryCacheBuilder());
然后打电话
CacheManager.BuildCache()
它只是遍历 CacheBuilders 列表并为它们中的每一个触发 PersistToCache。
但是,在 CountryCacheBuilder.PersistToCache 方法中,我看到 TypeFactory 属性在我期望它被实例化时为空。有人能告诉我我在这里想念什么吗?我是否需要告诉容器如何创建每个 CacheBuilder ?