使用 windsor 从另一个对象调用方法解决依赖关系
Resolve dependencies with calling method from another object, using windsor
我有一个名为 IContent 的接口,我在几个 类 中实现了它,在创建实例时我需要从数据库中获取每个 icontent 的属性值,我有一个 contentAppService 并且它有一个方法来获取icontent 从 db 获取属性值并创建 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 来解决这种情况,但是在 windsor 中我不知道如何解决这个问题。
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
我有一个名为 IContent 的接口,我在几个 类 中实现了它,在创建实例时我需要从数据库中获取每个 icontent 的属性值,我有一个 contentAppService 并且它有一个方法来获取icontent 从 db 获取属性值并创建 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 来解决这种情况,但是在 windsor 中我不知道如何解决这个问题。
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