我正在尝试为Excel VSTO项目配置DI.
为给定工作表生成的代码隐藏为我提供了一个名为Startup的事件,该事件可用于为Startup,Change,BeforeDoubleClick等事件设置事件处理程序.
我认为通常一个好的做法是避免代码隐藏文件中的代码.
我所做的是创建外部类,负责操作工作表并调用外部代码,如Web服务,数据库和域逻辑.
我可以成功创建一个由代码隐藏文件使用的工厂并实例化工作表逻辑类.
例如:
//...inside Sheet1.cs
private IExpenseWorksheetFactory _factory;
void ExpensesBeforeRightClick(Excel.Range target, ref bool cancel)
{
Application.EnableEvents = false;
var popup = _factory.CreateContextMenu();
popup.ShowContextMenu(target, ref cancel);
Application.EnableEvents = true;
}
// ... rest of Sheet1.cs
Run Code Online (Sandbox Code Playgroud)
上面的代码在Visual Studio生成的代码隐藏文件中,并且它是最小的.显示弹出窗口的责任委托给一个不同的对象.工厂对象负责与Ninject交谈并为我获取对象.当我传递这样的接口时,使用Ninject.Extensions.Factory项目自动生成此代理:
/// <summary>
/// Abstract Factory for creating Worksheet logic objects. Meant to be used with Ninject Factory extension.
/// </summary>
public interface IExpenseWorksheetFactory
{
ExpenseWorksheet CreateWorksheet();
ExpenseWorksheet.ContextMenus CreateContextMenu();
ExpenseWorksheet.Events CreateEventHandlers();
}
Run Code Online (Sandbox Code Playgroud)
在应用程序启动时,我已经为工厂本身定义了绑定和绑定:
//instantiate the kernel in app's Composition Root
_kernel …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可以在Azure Functions中的请求中重用的已配置对象.以下示例位于C#中.我们的想法是避免DocumentClient为每个请求昂贵地创建自定义实例.该client字段是静态的,在本示例中可以从文档中重用:
using System;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
private static DocumentClient client = GetCustomClient();
private static DocumentClient GetCustomClient()
{
DocumentClient customClient = new DocumentClient(
new Uri(ConfigurationManager.AppSettings["CosmosDBAccountEndpoint"]),
ConfigurationManager.AppSettings["CosmosDBAccountKey"],
new ConnectionPolicy
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp,
// Customize retry options for Throttled requests
RetryOptions = new RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests = 10,
MaxRetryWaitTimeInSeconds = 30
}
});
// Customize PreferredLocations
customClient.ConnectionPolicy.PreferredLocations.Add(LocationNames.CentralUS); …Run Code Online (Sandbox Code Playgroud)