Разрешить зависимости с помощью вызова метода из другого объекта, используя windsor - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть интерфейс с именем IContent, и я реализую его в нескольких классах. При создании экземпляров мне нужно получить значение свойств каждого значка из базы данных, у меня есть contentAppService, и у него есть метод для получения значка, который получает значение свойства изБД и создает экземпляр icontent:

public interface IContent {
}

public class PostContent : IContent {
 public string Title{set;get;}
 public string Content {set;get;}
}

public class contentAppService : appserviceBase
{
public T GetContent<T>() where T:class,IContent 
{
//some code to create instance of IContent
}
}

И в контроллере я пишу код, подобный этому:

public class HomeController
{
 private PostContent _postContent;
 public HomeController(PostContent  postContent)
 {
  _postContent=postContent;
}
}

При регистрации в Виндзоре мне нужно определить тип запрашиваемого объекта и, если он имеет типЗатем IContent вызывает contentAppService.GetContent для создания экземпляра.

В AutoFac мы можем реализовать IRegistrationSource для решения этого сценария, но в Виндзоре я не знаю, как решить проблему.

1 Ответ

0 голосов
/ 16 февраля 2019

GetContent<T>() можно использовать внутри FactoryMethod.Вы можете попробовать что-то вроде этого:

Func<IKernel, CreationContext, IContent> factoryMethod = (k, cc) =>
{
    var requestedType = cc.RequestedType; // e.g. typeof(PostContent)
    var contentAppService =  new ContentAppService(); 
    var method = typeof(ContentAppService).GetMethod("GetContent")
        .MakeGenericMethod(requestedType);
    IContent result = (IContent)method
        .Invoke(contentAppService, null); // invoking GetContent<> via reflection
    return result;
};

var container = new WindsorContainer(); 
container.Register( // registration
    Classes.FromThisAssembly()// selection an assembly
    .BasedOn<IContent>() // filtering types to register
    .Configure(r => r.UsingFactoryMethod(factoryMethod)) // using factoryMethod
    .LifestyleTransient());

var postContent = container.Resolve<PostContent>(); // requesting PostContent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...