【问题标题】:Service Stack inject object服务栈注入对象
【发布时间】:2016-05-12 16:32:53
【问题描述】:

我正在使用 ServiceStack 做一个应用程序。我可以毫无问题地注入一个对象,但是,该对象可以在服务类之外修改,所以,我需要再次重新注入 代码如下:

public class ClientManager: ApplicationContext{
   public ClientManager(AppConfig appConfig)
   {
        _appConfig = appConfig;
        _activeForm = LayoutFactory(appConfig.Layout);
        var appHost = new AppHost(_activeForm, _appConfig);
        var listeningOn = string.Format("http://*:{0}/", new Uri(appConfig.UrlBroker).Port);
        appHost.Init();
        appHost.Start(listeningOn);
        var timerMetadata = new Timer(CheckMetadata, null, 0, 60000);
    }
}

    public class AppHost : AppSelfHostBase
    {
        private ILayout _layout;
        private AppConfig _appConfig;
        public AppHost(ILayout activeForm, AppConfig appConfig)
        : base("ClientService", typeof(ClientService).Assembly)
    {
        _layout = activeForm;
        _appConfig = appConfig;
    }

    public override void Configure(Container container)
    {
        container.Register("activeForm", _layout);
        container.Register("config", _appConfig);

    }
}

    public class ClientService : Service
    {
        public HttpResult Post(Person request)
        {
           HttpResult response = new HttpResult();
            _initConf = ServiceStackHost.Instance.Container.ResolveNamed<AppConfig>("config");
        }
    }

所以,ClientManager 类有一个线程可以修改对象 appConfig 和 activeForm(这些对象被注入到服务类中) 现在,如果我修改对象,它不会再次注入它。我认为我应该处置 AppHost,然后重新启动它,你怎么看? 谢谢

【问题讨论】:

    标签: c# rest servicestack


    【解决方案1】:

    您很少会想要处置 AppHost,除非您在运行集成测试时要启动/销毁多个 AppHost 实例。

    另外我强烈建议不要在注册依赖项时使用名称,只需像往常一样使用依赖项的类型,例如:

    container.Register(_layout);
    container.Register(_appConfig);
    

    在 IOC 中注册的任何依赖项都会通过声明具有该类型的 公共属性 自动注入到您的服务类中,例如:

    public class ClientService : Service
    {
        public AppConfig AppConfig { get; set; }
    
        public HttpResult Post(Person request)
        {
           HttpResult response = new HttpResult();
           var _initConf = AppConfig;
        }
    }
    

    这会注入在 IOC 中注册的相同实例,因此如果您稍后修改该实例,Service 将默认注入相同的修改后实例。

    【讨论】:

    • 感谢您的评论。我按照你的建议做了。它仍然工作正常(对象被注入到服务类中)。但是,如果我将对象修改为 ClientManager 类,在服务类中我看不到更新的对象..
    • 不知道这怎么可能,它必须注入同一个实例,它不能创建一个新实例,它不知道如何。您确定要修改实例,而不仅仅是重新分配它,因为它不会修改实例。
    • 对不起,我将错误的数据分配到实例中。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2011-06-11
    • 2018-08-18
    • 2014-01-27
    相关资源
    最近更新 更多