简而言之,我正在尝试将this.db.openDatabase({
name: 'example.db',
location: 'default', // the location field is required
createFromLocation: 1,
existingDatabase: true,
});
容器与Castle Windsor
容器相关联。让我解释一下背景:
我有一个项目,其中很长一段时间它使用城堡windsor。几天前,我得到了一些我必须从旧项目中消费/使用的dll。这些DLL使用Unity Container作为其注入机制。我也可以访问这些dll中的接口/实现,但我不会尝试实例化手动实现,但我更愿意,如果可能的话,将Unity容器与我当前的城堡windsor容器相关联。我怎么能实现这个目标?
所以,如果我有:
Unity
如果我用windsor解决public class MyService: IService
{
public MyService (IThidPartyService thirdParty)
{
}
}
,那么IService
由另一个容器解决将会很好:Unity。
谢谢!。
答案 0 :(得分:4)
我认为这是使用自定义ISubDependencyResolver
的完美示例。每当Castle不知道如何解决特定的依赖关系时,它将解决该自定义解析器。新的解析器将取决于Unity容器,并将用它来解决" for"城堡。
如果之前的地方无法解析依赖项解析程序 如果它们将询问每个子解析器(ISubDependencyResolver) 可以提供依赖。
因此,当在Castle中找不到该依赖关系时,它将寻找将提供依赖关系的新解析器。
以下是构造函数注入和属性注入的工作示例:
class Program
{
static void Main(string[] args)
{
var unityContainer = new UnityContainer();
unityContainer.RegisterType<IDependency, Dependency1>();
unityContainer.RegisterType<IPropertyDependency, PropertyDependency1>();
WindsorContainer castleContainer = new WindsorContainer();
castleContainer.Kernel.Resolver.AddSubResolver(new UnityResolver(unityContainer));
castleContainer.Register(
Component.For<SomeType>());
var result = castleContainer.Resolve<SomeType>();
}
}
public interface IDependency { void Foo(); }
public class Dependency1 : IDependency { public void Foo() { } }
public interface IPropertyDependency { }
public class PropertyDependency1 : IPropertyDependency { }
public class SomeType
{
public SomeType(IDependency dependency) { ConstructorDependency = dependency; }
public IDependency ConstructorDependency { get; private set; }
public IPropertyDependency PropertyDependency { get; set; }
}
public class UnityResolver : ISubDependencyResolver
{
public UnityResolver(UnityContainer container)
{
Container = container;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return Container.Registrations.Any(z => z.RegisteredType.Equals(dependency.TargetType));
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return Container.Resolve(dependency.TargetType);
}
public UnityContainer Container { get; set; }
}
结果:
至于Unity
检查CanResolve
的代码 - 我确定可以改进 - 我不太了解Unity