首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TinyIoC将模型注入到类构造函数

TinyIoC将模型注入到类构造函数
EN

Stack Overflow用户
提问于 2015-04-04 08:14:46
回答 1查看 521关注 0票数 2

我在xamarin项目中使用TinyIoc,如果有必要,我可以更改IoC容器。我该如何解决这种情况?

代码语言:javascript
复制
internal class Program
{
    private static void Main(string[] args)
    {
        TinyIoC.TinyIoCContainer.Current.Register<IService, Service>();
        TinyIoC.TinyIoCContainer.Current.Register<ViewModel>();
        Model model; //From database... How I can inject this to my viewmodel?
        var viewModel = TinyIoC.TinyIoCContainer.Current.Resolve<ViewModel>();
    }
}

public class Model
{
    public object Data { get; set; }
}

internal interface IService
{
    string SomeMethod(Model model);
}

public class Service : IService
{
    public string SomeMethod(Model model)
    {
        //...
        return string.Empty;
    }
}

internal class ViewModel
{
    private readonly Model model;
    private readonly IService service;

    public string Name { get; private set; }

    public ViewModel(IService service, Model model)
    {
        this.model = model;
        this.service = service;
        this.Name = this.service.SomeMethod(this.model);
    }
}

我唯一想到的就是:

代码语言:javascript
复制
internal class Program
{
    private static void Main(string[] args)
    {
        TinyIoC.TinyIoCContainer.Current.Register<IService, Service>();
        TinyIoC.TinyIoCContainer.Current.Register<ViewModel>();
        Model model; //From database... How I can inject this to my viewmodel?
        var viewModel = TinyIoC.TinyIoCContainer.Current.Resolve<ViewModel>();
        viewModel.Initialize(model);
    }
}

internal class ViewModel
{
    private Model model;
    private readonly IService service;

    public string Name { get; private set; }

    public ViewModel(IService service)
    {
        this.service = service;
    }

    public void Initialize(Model model)
    {
        this.model = model;
        this.Name = this.service.SomeMethod(this.model);
    }
}

但我真的不喜欢这样:-(我有一个糟糕的设计?是否应该使用依赖注射而不是构造器注射?或者另一个禁闭者可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2015-04-06 04:00:13

查看Func的重载方法,看看哪一个最适合,因为我不知道TinyIoC是如何处理注册实际实现的。像这样的东西可能会起作用:

代码语言:javascript
复制
.Register<ViewModel>(() => new ViewModel(
    TinyIoC.TinyIoCContainer.Current.Resolve<IService>(), 
    model));

或者只是传递服务的新实例:

代码语言:javascript
复制
.Register<ViewModel>(() => new ViewModel(new Service(), model));

如果TinyIoC不符合要求,那么您可以在XLabs.IoC中寻找与Xamarin兼容的替代方案:http://www.nuget.org/packages?q=xlabs.ioc

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29441364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档