将用户信息传递到数据访问

发布于 2024-12-11 13:14:43 字数 1229 浏览 0 评论 0原文

我正在开发一个桌面应用程序,该应用程序已生成用于数据库访问的代码并使用静态对象进行用户识别。

现在我们需要通过 Web 服务公开一些逻辑,并且我们正在寻找侵入性最小的形式将用户信息通过管道推送到数据库访问类。

我们想出的是将委托传递给插入/更新方法,如下所示:

public delegate string GetLogin();

public class BaseEntity : BaseNotifiableEntity, System.ComponentModel.IDataErrorInfo
{
    public GetLogin Login { get; set; }
    (...)
}

public static class BaseEntityHelper
{
    public static SqlCommand buildUpdateCommand(BaseEntity entity)
    {
        UpdateDefaultValues(entity, false);
        (...)
    }

    public static void UpdateDefaultValues(BaseEntity entity, bool affectCreationFields)
    {
        if (entity.Login == null && AppServer.RunningApplication.CurrentUser == null)
            throw new Exception("Something went wrong");

        (...)
    }
}

因此,在我们的逻辑中将会有这样的内容:

    public class Service
    {
        T_DIST_Service record;
        (...)

        public bool Update(DataAccess.Base.GetLogin login)
        {
            record.Login = login;
            (...)
            record.Update();
        } 
    }

这当然涉及更改应用程序中的许多方法。 所以我想知道是否有一种无缝的方法可以使用依赖注入(例如)来完成此任务。

也许你们中的一些人已经走上了这条路,并有一些见解可以分享。 感谢您抽出时间。

编辑1: 使用.NET

I'm working on a desktop application that has generated code for database access and uses static objects for user identification.

Now we need to expose some of the logic by webservice and we are looking for the least intrusive form to push the user information down the pipe to the database access classes.

What we came up with was to pass a delegate to the Insert / Update methods that looks like this:

public delegate string GetLogin();

public class BaseEntity : BaseNotifiableEntity, System.ComponentModel.IDataErrorInfo
{
    public GetLogin Login { get; set; }
    (...)
}

public static class BaseEntityHelper
{
    public static SqlCommand buildUpdateCommand(BaseEntity entity)
    {
        UpdateDefaultValues(entity, false);
        (...)
    }

    public static void UpdateDefaultValues(BaseEntity entity, bool affectCreationFields)
    {
        if (entity.Login == null && AppServer.RunningApplication.CurrentUser == null)
            throw new Exception("Something went wrong");

        (...)
    }
}

So in our logic will would have something like this:

    public class Service
    {
        T_DIST_Service record;
        (...)

        public bool Update(DataAccess.Base.GetLogin login)
        {
            record.Login = login;
            (...)
            record.Update();
        } 
    }

This of course involves changing a lot of methods in the application.
So i was wondering if there's a seamless way to accomplish this using dependency injection (for example).

Probably some of you have already go down this road and have some insights to share.
Thank you for your time.

EDIT 1:
Using .NET

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁绊已千年 2024-12-18 13:14:43

在架构层面上,听起来像我一样,您正在尝试将不属于那里的逻辑放入数据访问层中。数据访问组件应该只是一个反腐败层,因此理想情况下应该实现任何逻辑在调用层。

但是,如果您现在想要更立即的修复,最建议使用内置的 Thread.CurrentPrincipal 环境上下文。

如果您的用户对象必须携带特殊信息,则可以使用 IPrincipal 创建自定义 用户上下文

On an architectural level it sounds like me that you are attempting to put logic in the data access layer that doesn't belong there. A data access component should be nothing but an anti-corruption layer, so any logic should ideally be implemented in the calling layer.

However, if you want a more immediate fix here and now, it would be most recommendable to use the built-in Thread.CurrentPrincipal Ambient Context.

If you have special information that your user object must carry around, you can use a custom implementation of IPrincipal to create a custom User Context.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文