0

在阅读了对 Caliburn.Micro的精彩介绍之后,我似乎错过了一件事,那就是如何使用期望参数的构造函数注册一个类

这里有问题的行是:

_container.PerRequest<IMobileServiceClient, MobileServiceClient>();

public class Bootstrapper : PhoneBootstrapper
{
    private PhoneContainer _container;

    protected override void Configure()
    {
        _container = new PhoneContainer();

        _container.RegisterPhoneServices(RootFrame);
        _container.PerRequest<MainPageViewModel>();
        _container.PerRequest<IRepository, Repository>();
        _container.PerRequest<IMobileServiceClient, MobileServiceClient>();
        AddCustomConventions();
    }

    //...
}   
4

2 回答 2

1

我将在这里扩展@flo 的答案。

当您尝试构建的具体类型通过其已在容器中注册的构造函数接受类型时,Caliburn.Micro 将在尝试创建该类型时自动为该类型提供所需的内容。

例如,如果您有一个名为的具体类MyClass,它接受一个类型的对象IHell和另一个类型的对象,IHeaven如下所示:

public class MyClass {
    public MyClass(IHell hell, IHeaven) { }
}

那么你需要做的就是:

container.PerRequest<IHell, ConcreteHell>();
container.PerRequest(IHeaven, ConcreteHeaven>();

现在,当 Caliburn.Micro 尝试创建它的实例时,它将MyClass从容器中拉出。IHellIHeaven

现在回到您的问题,似乎MobileServiceClient只通过其构造函数接受原始类型,例如stringUri以及您无法直接在容器中注册的其他类型。

在这种情况下,您有两种选择:

  1. 创建一个创建MobileServiceClients的工厂IMobileServiceClientFacotryMobileServiceClientFactoryImpl然后将它们注册到容器中,并将它们注入到需要创建实例MobileServiceClient并在那里使用它们的类型中。

    从软件工程的角度来看,这是更合适的解决方案,但它需要另外两种类型的开销。

  2. 使用Handler机制注册类型,用于模拟工厂:

    container.Handler<IMobileServiceClient>( iocContainer => new MobileServiceClient("http://serviceUrl.com:34"); );
    

    当您在大型应用程序中不需要过于复杂的工厂时,此解决方案更快且更适合。

于 2013-11-02T13:15:05.627 回答
0

PhoneContainer 用作 IoC 容器。这意味着,将在创建具体实例时为您解决构造函数依赖关系:

public class MobileServiceClient : IMobileServiceClient
{
 private IRepository _repository;

 // repository is resolved and injected by PhoneContainer 
 public MobileServiceClient (IRepository repository)
 {
  _repository = repository;
 }
}

但是,如果您需要继续控制注射。如果 LifetimeMode 不同,您可以在 Bootstrapper 中配置实例:

this.container.RegisterPerRequest(
                typeof(IMultiSelectionContext),
                null,
                new MobileServiceClient(new RepoXy()), null)));
于 2013-11-02T11:51:20.863 回答