如何使用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给我一个未注册的对象实例?

所以流行的反应似乎是"只需注册组件",我真的不喜欢,因为对于这样一个简单的用例,我可能会以配置类的数百个不必要的注册结束。这有点傻。因此,与此同时,直到我发现一些内置的功能,我已经创建了一个俗气的扩展,应该让我在中间的某个地方。这个扩展只是接受类型,为您注册它,然后尝试解决它。这样,它就利用了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)
    {
    }

}