标签: enterprise-library

判断一个方法是否是策略注入中的属性的最佳方法是什么?

我有一个应用于类的自定义处理程序(使用 entlib 4 中的策略注入应用程序块),我想知道调用 Invoke 时输入方法是否是一个属性。以下是我的处理程序的样子。

[ConfigurationElementType(typeof(MyCustomHandlerData))]
public class MyCustomHandler : ICallHandler
{
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        if (input.MethodBase.IsPublic && (input.MethodBase.Name.Contains("get_") || input.MethodBase.Name.Contains("set_")))
        {
            Console.WriteLine("MyCustomHandler Invoke called with input of {0}", input.MethodBase.Name);
        }
        return getNext().Invoke(input, getNext);
    }

    public int Order { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

正如您从我的代码示例中看到的,到目前为止我想到的最好方法是解析方法名称。难道没有更好的方法吗?

c# enterprise-library policy-injection

3
推荐指数
1
解决办法
2798
查看次数

ExecuteNonQuery:尚未初始化Connection属性

我以前在这里问过这个问题,但从未使用过Enterprise Library.我之前使用过如下代码,它运行正常.这次有什么问题?我在最后一行收到错误:

    Database db = new SqlDatabase(MyConfiguration.Current.ConnectionString);
    DbCommand cmd = db.GetStoredProcCommand("AddWorkListItem");

    db.AddInParameter(cmd, "@PartNumber", DbType.String, partNumber);
    db.AddInParameter(cmd, "@Quantity", DbType.Int32, qty);
    db.AddInParameter(cmd, "@WorkListTypeCode", DbType.String, code);
    db.AddInParameter(cmd, "@UserKey", DbType.Int32, userKey);

    return cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

enterprise-library executenonquery

3
推荐指数
1
解决办法
2038
查看次数

记录应用程序块 - 记录调用者

使用Log4Net进行日志记录时,将调用日志的类放入日志文件中非常容易.我在过去发现,这使得跟踪代码并查看类中的流程变得非常容易.在Log4Net中,我在转换模式中使用%logger属性,如下所示:

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
Run Code Online (Sandbox Code Playgroud)

这给了我想要的输出:

2008-09-19 15:40:26,906 [3132] ERROR <b>Log4NetTechDemo.Tester</b> [(null)] - Failed method

您可以从输出中看到调用日志的类是Log4NetTechDemo.Tester,因此我可以很容易地将错误追溯到该类.

在Logging Applicaton Block中,我无法通过简单的日志调用来弄清楚如何执行此操作.有谁知道怎么做?如果是这样,那么这样做的一个例子或步骤将非常有帮助.

c# logging enterprise-library application-blocks

2
推荐指数
1
解决办法
1889
查看次数

仅使用连接字符串打开Microsoft.practices.EnterpriseLibrary数据库

我正在使用Microsoft.Practices.EnterpriseLibrary数据库工具,我使用连接字符串信息创建新数据库时遇到问题.

理想情况下,我想做以下事情:

Database dbEngine = DatabaseFactory.CreateDatabase(
    "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;");
Run Code Online (Sandbox Code Playgroud)

是否可以仅使用连接字符串创建数据库?

如果是这样,怎么能实现呢?

database connection-string enterprise-library database-connection

2
推荐指数
2
解决办法
2万
查看次数

我可以在运行时更改企业库日志记录块的配置吗?

在没有深入讨论EntLib日志块的优点或其他内容的情况下,有什么方法可以在运行时更改它的配置?

例如,我将块配置为将常规事件记录到平面文件,将重要事件记录到事件日志.
是否有任何方法可以更改它以将常规事件记录到控制台等,而无需重新启动我的应用程序?

澄清:我正在编写一个长期运行的服务器应用程序.我希望能够临时增加各种日志记录组的详细程度/输出以进行诊断/故障排除,而无需重新启动应用程序.重启不是一种选择,因为它意味着生产中的"站点停机".

logging enterprise-library configuration-files

2
推荐指数
1
解决办法
5884
查看次数

在日志应用程序块中将日期添加到日志文件名

我正在使用Microsoft Logging Application Block(版本5 beta 2),我正在尝试将日志文件的文件名动态设置为年月和日(然后每天写一个新的日志文件).但是,在运行时,记录器会忽略任何动态环境变量,例如%date%,%time%或%cd%.我可以将静态环境变量添加到文件名(例如%username%),但不能添加动态环境变量.有谁知道如何让滚动平面文件跟踪侦听器动态设置日志文件名中的日期?

(这就是我将文件名设置为:Log_%date%.log)

logging enterprise-library application-blocks

2
推荐指数
1
解决办法
3417
查看次数

Unity/EntLib:将依赖项注入CustomTraceListener

对不起,这是一个非常特殊的主题,所以这可能不是很多人感兴趣的.:-(

但是,我需要做以下事情:

  • 我有一个应用程序,它提供了某种控制台窗口的日志记录(它是一个WPF窗口,因为应用程序需求,因为应用程序需要看起来华而不实 - 我们的特殊客户要求并在每次我们见面时讨论它)

  • 为了提供与线程无关的日志记录,我创建了一个接口/实现对"IGUIController"/"GUIController"

到现在为止还挺好.一切都很好.

然而:

  • 我需要我自己的自定义跟踪侦听器(我称之为"GUITraceListener"),它使用IGUIController接口将特定的日志消息写入那个华而不实的WPF​​窗口

到目前为止,我的解决方案是让一个黑客,旧的skool代码闻到单身式 - 风格"当前" - 我的GUIController属性(是的,我很惭愧,我知道这很糟糕),我这样调用:

GUIController.Current.Log(message);
Run Code Online (Sandbox Code Playgroud)

显然,这是一个禁忌.

因此,正确的方法是注入依赖(当然).但是,当我这样做时,我得到了投诉(运行时),我没有为我的GUITraceListener类提供0(零)参数的构造函数.

事实上,我在这里得到:

EnterpriseLibraryContainer.ConfigureContainer(configurator, 
ConfigurationSourceFactory.Create());
Run Code Online (Sandbox Code Playgroud)

投诉是:

ArgumentException未处理无法为GUITraceListener找到合适的0参数构造函数

这真的很糟糕.我的意思是,Unity是企业库的一部分,为什么这些人不会简单地添加注入我的依赖项的可能性?

澄清:

我最终想要的是:

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="guiController"></param>
    public GUITraceListener(IGUIController guiController)
    {
        // Store the dependencies
        this.m_GUIController = guiController;
    }
Run Code Online (Sandbox Code Playgroud)

enterprise-library ioc-container unity-container

2
推荐指数
1
解决办法
1930
查看次数

使用entlib进行单元测试 - 不包括捕获量

我有一个方法可以做一些IO,通常看起来像这样:

public bool Foo()
{
    try
    {
        // bar

        return true;
    }
    catch (FileNotFoundException)
    {
        // recover and complete
    }
    catch (OtherRecoverableException)
    {
        // recover and complete
    }
    catch (NonRecoverableException ex)
    {
        ExceptionPolicy.HandleException(ex, "LogException");
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法不是完成任务的关键,有外部恢复步骤 - 并且抛出NonRecoverableException是相对常见的 - 它在规范中返回false,报告'此时无法完成'并且处理移动.NonRecoverableException不会将程序置于无效状态.

当我进行单元测试时,抛出其中一个异常,我得到了错误

Activation error occured while trying to get instance of type ExceptionPolicyImpl
Run Code Online (Sandbox Code Playgroud)

而且我想压制它,而不是获取实际/原始异常信息,而不是EntLib无法记录(并且,实际上强制NonRecoverableException并且具有[ExpectedException(typeof(NonRecoverableException))]单元测试以确保这种方法符合规范.

我怎么能这样做?

编辑 使用预处理程序指令并不理想,因为我讨厌在代码库中看到特定于测试的代码.

c# enterprise-library exception-handling

2
推荐指数
1
解决办法
528
查看次数

c#Construct <xxx>

我刚开始评估MS企业库.他们使用以下指示来获取实例:

var customerDb = 
    EnterpriseLibraryContainer.Current.GetInstance<Database>("Customers");
Run Code Online (Sandbox Code Playgroud)

我知道GetInstance是方法,但是什么样的构造(或结构)<Database>是什么?它是某种通用的吗?

c# enterprise-library

2
推荐指数
1
解决办法
139
查看次数

只更新了1条记录时,ExecuteNonQuery返回值2

运行Enterprise Library 5.0的示例,当我使用ExecuteNonQuery运行更新sproc时,它返回2.更新基于ProductID,表的主键(是的,我检查过,它是唯一的).

这是简单的sproc:

ALTER PROCEDURE [dbo].[UpdateProductsTable]
     @ProductID int, 
     @ProductName varchar(50) = NULL, 
     @CategoryID int = NULL, 
     @UnitPrice money = NULL
AS
BEGIN
    UPDATE Products
    SET 
        ProductName = @ProductName, 
        CategoryID = @CategoryID, 
        UnitPrice = @UnitPrice
    WHERE ProductID = @ProductID
END
Run Code Online (Sandbox Code Playgroud)

在SSMS中执行此sp在查询结果窗口的右下角显示"1行",并在网格中返回0.单击消息选项卡显示

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

不知道为什么我在这里看到这3次,但我不相信这是问题所在.

这是调用sp的代码:

public static void Exec_Update_Query()
        //updates a column of a single row, checks that the update succeeded, and then update it again to return it to the original value …
Run Code Online (Sandbox Code Playgroud)

enterprise-library executenonquery c#-4.0

2
推荐指数
1
解决办法
6294
查看次数