服务堆栈注入对象

时间:2016-05-12 16:32:54

标签: c# rest servicestack

我正在使用ServiceStack做一个应用程序。我可以毫无问题地注入一个对象,但是,可以在Service Class之外修改该对象,因此,我需要重新注入 这是代码:

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,然后重新开始,你怎么看? 感谢

1 个答案:

答案 0 :(得分:2)

除非您正在运行要启动/销毁多个AppHost实例的集成测试,否则您很少需要处理AppHost。

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

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

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

public class ClientService : Service
{
    public AppConfig AppConfig { get; set; }

    public HttpResult Post(Person request)
    {
       HttpResult response = new HttpResult();
       var _initConf = AppConfig;
    }
}

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