gpt4 book ai didi

c# - 如何为这种情况编写 StructureMap 扫描器

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:13 24 4
gpt4 key购买 nike

我在注册表中进行了这些注册,并试图找出使用扫描仪而不是手动注册来实现它们的正确方法。

For<ISomeView>.Use(HttpContext.Current.CurrentHandler)
For<IOtherView>.Use(HttpContext.Current.CurrentHandler)
For<IAnotherView>.Use(HttpContext.Current.CurrentHandler)

等等。我曾经有一个来自 IView 的接口(interface)用作标记界面。

我最初的尝试结果是这样的

public void Process(Type type, Registry registry)
{
Type _pluginType = typeof(IView);

if (type.CanBeCastTo(_pluginType) && type.IsInterface)
{
string name = type.Name;
registry.AddType(_pluginType, type, name);

registry.For(_pluginType).Use(HttpContext.Current.CurrentHandler);
}
}

然而,这导致我的物理 ASP.NET 页面被注册为它自己。这是我从 WhatDoIHave() 得到的

the_page_aspx (ASP.the_page_aspx) - 36d0cdb2-7118-4a1d-94a0-8de1b5ddc357 - 
Configured Instance of ASP.the_page_aspx, App_Web_4q8pukge, Version...

编辑:为了回应 KevM 的评论,我想要实现的是任何时候 StructureMap 需要注入(inject)我的任何一个 IView,它通过返回 HttpContext.Current.CurrentHandler 来解决它。

所以如果我调用 ObjectFactory.Resolve<ISomeView>()我会得到 (ISomeView)HttpContext.Current.CurrentHandler

如果我有一个 SomePresenter(IListView listView, IEditView editView) 的构造函数这些将被解决为(IListView)HttpContext.Current.CurrentHandler(IEditView)HttpContext.Current.CurrentHandler .

我可以用很多 For<>.Use() 来做到这一点在我的示例中的语句,这意味着我应该能够使用扫描仪来实现它,而不是需要手动显式注册每个。如果命名约定有助于编写扫描仪,我的界面将始终命名为 I_____View。我只是不确定我需要在上面的 Process() 的 if 语句中使用什么方法。

更新:@KevM 的回答为我指明了正确的方向

public class ViewScanner : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (type.IsA<IView>() && !type.IsConcrete())
{
registry.For(type).Use(c => HttpContext.Current.CurrentHandler);
}
}
}

(IsA<> 只是 IsAssignableFrom 的扩展,因为对我来说它的使用感觉倒退)

最佳答案

我希望这接近您要找的东西。

public interface IView { }
public class View : IView { }
public class View2 : IView { }

public static class IckyStaticMonster
{
public static IView Current { get; set;}
}

[TestFixture]
public class configuring_concrete_types
{
[Test]
public void TEST()
{
var container = new Container(cfg =>
{
cfg.Scan(scan =>
{
scan.TheCallingAssembly();
scan.Convention<ViewScanner>();
});
});

var current = new View2();
IckyStaticMonster.Current = current;

var view2 = container.GetInstance<View2>();

view2.ShouldBeTheSameAs(current);
}
}

public class ViewScanner : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
Type _pluginType = typeof (IView);

if (_pluginType.IsAssignableFrom(type) && _pluginType.IsInterface)
{
registry.For(type).Use(c=>IckyStaticMonster.Current);
}
}
}

关于c# - 如何为这种情况编写 StructureMap 扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com