我有一个继承自另一个的接口
<td>
<button id="btnAdd" name="btnAdd">ADD</button>
</td>
@foreach (var item2 in Model2)
{
if (item2.Order == item.OrderNumber)
{
<tr class="rowClass td1" id="td1" style="background-color:rgb(217,237,247); padding:0px;">
<td style="width:20px"></td>
<td>
<div>
@Html.DisplayFor(modelItem => item2.PickNo)
</div>
</td>
<td colspan="4">
<div style="float:left">
Ended:
@Html.DisplayFor(modelItem => item2.PickEndDate)
@Html.DisplayFor(modelItem => item2.PickEndTime)
</div>
</td>
<td></td>
<td>
<div>
<img src="~/Icons/WAGIconPDF.PNG" width="20" height="20" /> @Html.DisplayFor(modelItem => item2.InvNo)
</div>
</td>
<td>
<div>
<img src="~/Icons/WAGIconWarehouse1.PNG" width="20" height="20" /> @Html.DisplayFor(modelItem => item2.WarehouseCode)
</div>
</td>
</tr>
}
}
使用Simple Injector我注册我的类型和实现
public interface ISpecificHandler : IHandler
但我怎样才能解决container.RegisterSingleton<ISpecificHandler, SpecificHandlerImpl>();
而不是IHandler
?
ISpecificHandler
这会抛出I //Expect SpecificHandlerImpl as handler
IHandler handler = ServiceLocator.GetInstance<IHandler>(); //error
IHandler类型未注册
答案 0 :(得分:3)
有几种解决方案,但它实际上取决于您的应用程序真正需要的内容。以下是一些建议。
您只需注册两次实施:
container.Register<IHandler, SpecificHandlerImpl>(Lifestyle.Scoped);
container.Register<ISpecificHandler, SpecificHandlerImpl>(Lifestyle.Scoped);
但也许您想要解决多个处理程序,在这种情况下,您可能必须将它们注册为集合:
var reg1 = Lifestyle.Singleton.CreateRegistration<SpecificHandlerImpl>();
var reg2 = Lifestyle.Singleton.CreateRegistration<AnotherHandlerImpl>();
container.RegisterCollection<IHandler>(new[] { reg1, reg2 });
但是在使用非通用IHandler
接口时可能会遇到麻烦,因为您通常会在某个场景中执行一个特定的实现(换句话说,您可能违反了{{} 3}})。因此,您通常更善于使用泛型IHandler<T>
抽象,其中T
是包含处理程序值的参数对象。在这种情况下,封闭的IHandler<T>
和实现之间始终存在一对一的映射。 Liskov Substitution Principle很好地解释了这种设计的优点。
但是如果不知道你想要解决的问题,很难说对你来说什么是正确的解决方案。