如何使用Simple Injector解析基接口实例

时间:2016-04-28 12:10:07

标签: c# ioc-container simple-injector

我有一个继承自另一个的接口

<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类型未注册

1 个答案:

答案 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很好地解释了这种设计的优点。

但是如果不知道你想要解决的问题,很难说对你来说什么是正确的解决方案。