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을 사용하면 기존 개체를 변경할 수 있습니다.
세터 주입은 내 솔루션입니까?
이 주입 값을 인터페이스의 속성으로 만들 수 없으므로 매번 새로운 클래스 인스턴스를 주입 할 필요가 없습니까? 매번 생성자 매개 변수 만 변경되는 경우 종속성을 다시 주입하는 것은 끔찍한 연습처럼 보입니다. –
@SimonWhitehead 나는 할 수 없다. 왜냐하면 내가 테스트 한 서비스 클래스는 실제로 .NET 라이브러리의 클래스이기 때문이다. (DbContext). 생성자에 연결 문자열을 전달해야합니다. – Shahin
@shaahin IoC는 자신이 만든 인스턴스 (AFAIK 제외)를 추적하지 않습니다. 그래서, 짧은 대답은 컨테이너로 이것을 할 수있는 방법이 없다는 것입니다. 당신이 할 수있는 것은 당신이 제어하는 메소드에 GetInstance() 메소드를 랩핑하고 필요할 때마다 의존성을 변경할 수 있도록 직접 생성 된 인스턴스를 추적하는 것입니다. 그러나 응용 프로그램 전체에서 인스턴스 추적을 유지하는 것이 쉬운 일이 아니기 때문에 그렇게하지 말라고 조언합니다. 이유를 재고하고 해결책을 재고해야합니다. – tucaz