如何在数据层中使用Caliburn.Micro SimpleContainer

时间:2013-10-14 13:52:02

标签: c# inversion-of-control caliburn.micro

也许这是一个愚蠢的问题,但我坚持下去。

我试图在整个应用程序中使用SimpleContainer作为IoC,所以在我的数据访问层中我以这种方式定义了一个引导程序:

    public class AppBootstrapper : BootstrapperBase 
    {
        SimpleContainer container;

        public AppBootstrapper()
        {
            Start();
        }

        protected override void Configure()
        {
            container = new SimpleContainer();
            container.PerRequest<IMyClass, MyClass>();
        }

        protected override object GetInstance(Type service, string key)
        {
            var instance = container.GetInstance(service, key);
            if (instance != null)
                return instance;

            throw new InvalidOperationException("Could not locate any instances.");
        }

但我怎么能用呢?

我只想获得一个实现并尝试编写:

IMyClass mc = new IoC.GetInstance(IMyClass );

但我没有找到

我试过了:

SimpleContainer container = new SimpleContainer();
IMyClass mc = new container.GetInstance(IMyClass,null);

IMyClass mc = new IoC.GetInstance(IMyClass, null);

但它们都不起作用。

怎么了?

编辑:

而且,如果我为每个项目都有一个AppBootstrapper.cs,那么一切运作良好或最佳实践是不同的?

1 个答案:

答案 0 :(得分:10)

IMyClass mc = new IoC.GetInstance(IMyClass );

你可以这样做,因为IoC是一个static类,所以你不能创建它的新实例,而是你可以这样做:

IMyClass mc = IoC.Get<IMyClass>();

尽管如此,这也不是推荐的方式。

在你初始化你的引导程序之后,让我们假设你有SellViewModel这样:

public class ShellViewModel {

    private IMyClass _mc;

    public ShellViewModel(IMyClass mc) {
        _mc = mc;
    }
}

现在,当Caliburn.Micro尝试实例化ShellViewModel时,它会注意到构造函数接受IMyClass的实例,然后它将自动为您创建该类的实例并将其提供给ShellViewModel

我真的建议您阅读Dependency InversionInversion of Control,然后阅读SimpleContainer课程的文档,然后阅读文章Screens, Conductors and Composition,感受一下整个过程。