Я хочу реализовать шаблон декоратора с помощью StructureMap 4.
Я создал интерфейс IDeveloper
и две реализации CSharpDeveloper
, который является декорированным типом, и DeveloperDecorator
, который является декоратором.
Тип декоратора зависит от IDeveloper
, а сам класс реализует IDevloper
, что означает, что один из типов должен быть именованным экземпляром.
Именованный экземпляр CSharpDeveloper
public interface IDeveloper
{
}
public class CSharpDeveloper : IDeveloper
{
}
public class DeveloperDecorator : IDeveloper
{
private readonly IDeveloper developer = null;
public DeveloperDecorator(IDeveloper developer) {
this.developer = developer;
}
}
Я хочу зарегистрировать DeveloperDecorator как IDeveloper
, чтобы я мог разрешить тип с помощью безымянной функции перегрузки GetInstance
container.GetInstance<IDeveloper>();
и StructureMap сможет разрешить зависимый тип как именованный экземпляр. Что-то вроде этого (концептуальный код)
Func<IDeveloper> factory = () => {
return new DeveloperDecorator(container.GetInstance<IDeveloper>("name"));
};
Я вообще не могу использовать универсальные шаблоны, поэтому не могу использовать Ctor<TCtorType>()
api.
У меня есть тип с именем TypeMap
, который содержит тип службы, конкретный тип и необязательное имя.
public class TypeMap
{
public string Name { get; set; }
public Type ServiceType { get; set; }
public Type ConcreteType { get; set; }
}
и я пытался использовать зависимости, но ничего не помогло.
public void Register(TypeMap typeMap, ITypeMapCollection dependencies = null) {
container.Configure(x => {
var use = x.For(typeMap.ServiceType)
.Add(typeMap.ConcreteType);
if (typeMap.Name.IsNotNullOrEmpty()) {
use.Named(typeMap.Name);
}
if (dependencies.IsNotNullOrEmpty()) {
dependencies.ForEach(dependency => {
use.Dependencies.Add(dependency.Name, dependency.ServiceType);
});
}
});
}
Спасибо.