我正在開發WPF應用程序。
我使用StructureMap來注入依賴關係。
存在一些服務層類,它們從構造函數中給出參數。
我傳遞給構造函數的值將改變運行時間。
表示層的類使用服務來爲用戶呈現數據。每當價值發生變化,我都會重新注入新的價值。但表示層的活動實例返回以前的值。
我編寫了一個簡單的例子,以便更好地理解。更改現有對象的依賴關係
// static class that keeps some value
public class ValueKeeper
{
public static string Value { get; set; }
}
public interface IService
{
string Value { get; set; }
}
// Service layer class
public class Service : IService
{
// default constructor
public Service(string value)
{
Value = value;
}
#region IService Members
public string Value { get; set; }
#endregion
}
public class Program
{
private readonly IService _service;
//injecting service class
public Program(IService service)
{
_service = service;
}
// structuremap configuration
private static void Config()
{
ObjectFactory.Initialize(x => x.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.WithDefaultConventions();
x.For<IService>().CacheBy(InstanceScope.Hybrid).Use(() =>
{
var service = new Service("value1");
return service;
});
}));
}
// structuremap configuration after value changed.
private static void ReConfig()
{
ObjectFactory.Configure(x => x.Scan(scanner =>
{
x.For<IService>().CacheBy(InstanceScope.Hybrid).Use(() =>
{
var service =new Service(ValueKeeper.Value);
return service;
});
}));
}
private string PresentationMethod()
{
return _service.Value;
}
private static void Main(string[] args)
{
Config(); // Firtst time injecting dependencies
var prog = ObjectFactory.GetInstance<Program>();
Console.WriteLine(prog.PresentationMethod()); // returns "value1"
ValueKeeper.Value = "value 2"; //changing static property
ReConfig(); // reconfig service class with new property
Console.WriteLine(prog.PresentationMethod()); // it returns value1 but I expect value2 .
Console.ReadKey();
}
}
真正的應用程序包含許多演示文稿和服務類。
如何使用新對象和值更改實時服務實例?
更新: 我看到this鏈接。看來通過使用Setter Injection可以改變現有的對象。
setter注入我的解決方案?
您是否可以不使這個注入值也是界面的一個屬性,以便您不必每次都不斷注入一個類的新實例?如果只有構造函數參數每次都在變化,那麼重新注入依賴關係似乎是一種可怕的做法。 – 2013-04-08 00:56:05
@SimonWhitehead我不能。因爲我的exampled服務類實際上是.NET庫中的一個類。 (的DbContext)。我必須將連接字符串傳遞給它的構造函數。 – Shahin 2013-04-08 01:07:43
@shaahin沒有IoC跟蹤它創建的實例(除非是它的單例)AFAIK。所以,簡短的回答是,沒有辦法與容器做到這一點。你可以做的是將GetInstance()方法封裝在一個你控制的方法中,並且跟蹤自己創建的實例,這樣你就可以隨時改變它們的依賴關係。不過,我建議你不要這樣做,因爲在整個應用程序中跟蹤實例並非易事。您應該重新考慮您的理由並重新考慮解決方案。 – tucaz 2013-04-08 13:52:59