如何使用windsor给我一个未注册的对象实例?
本文关键字:注册 一个 对象 实例 windsor 何使用 | 更新日期: 2023-09-27 18:09:13
我已经设置好了windsor并注册了我的所有服务。我有一个类需要在actor中提供这些服务,但是这个类没有注册到windsor,因为它没有接口,而且我不想为了依赖性解析而给它一个接口。我真正感兴趣的是,让windsor resolve注入我注册的依赖项,然后给我一个初始化的类——基本上是一个工厂。
我遇到的问题是温莎抛出,因为依赖类尚未注册:
void Main()
{
var container = new WindsorContainer();
container.Register(Component
.For<ITestInterface>()
.ImplementedBy<TestImpl>()
.LifestyleTransient());
var c = container.Resolve<TestClass>(); // throws because TestClass isn't registered
c.Run();
}
public class TestClass
{
private ITestInterface _d;
public TestClass(ITestInterface d)
{
_d = d;
}
public void Run()
{
_d.Do();
}
}
public interface ITestInterface
{
void Do();
}
public class TestImpl : ITestInterface
{
public void Do()
{
Console.WriteLine("done");
}
}
我不想最后做的是这样的事情:
var dependency1 = container.Resolve<ITestInterface>();
var c = new TestClass(dependency1);
c.Run();
因为现在我们在服务定位器领域。但更重要的是,有几个依赖的类…那可能会很乏味。
我怎样才能使windsor达到预期的工厂效果?或者和温莎在一起有可能吗?
所以流行的反应似乎是"只需注册组件",我真的不喜欢,因为对于这样一个简单的用例,我可能会以配置类的数百个不必要的注册结束。这有点傻。因此,与此同时,直到我发现一些内置的功能,我已经创建了一个俗气的扩展,应该让我在中间的某个地方。这个扩展只是接受类型,为您注册它,然后尝试解决它。这样,它就利用了Windsor自己的元素解析逻辑:
public static class WindsorExtentions
{
public static T Construct<T>(this IWindsorContainer container)
where T : class
{
if (!container.Kernel.HasComponent(typeof(T)))
container.Register(Component.For<T>());
var instance = container.Resolve<T>();
return instance;
}
}
我真正想做的是注册它,解析它,然后注销它,但似乎RemoveComponent方法已在3.0中删除。现在应该没问题了。显然,它不是所有的用例,但当你有大量的代理类,有几个需要的依赖注入,我认为这是有帮助的。
用法:
var myClassWithDependencies = myContainer.Construct<MyClassWithDependencies>();
public class MyClassWithDependencies
{
public MyClassWithDependencies(
IFacebookClient facebookClient,
IGooglePlusClient googlePlusClient,
ITwitterClient twitterClient,
ISalesforceClient salesforceClient,
IReportRepository reportRepo,
IUserRepository userRepo)
{
}
}