gpt4 book ai didi

c# - 自动实现装饰器方法

转载 作者:行者123 更新时间:2023-11-30 12:38:49 24 4
gpt4 key购买 nike

我想不出更好的措辞方式,所以它可能在那里,但我不知道它的术语。我有许多用于访问遵循如下模式的不同数据存储的类:

interface IUserData {
User GetUser(uint id);
User ByName(string username);
}

class UserData : IUserData {
...
}

class AuthorizedUserData : IUserData {
IUserData _Data = new UserData();

public User GetUser(uint id) {
AuthorizationHelper.Instance.Authorize();
return _Data.GetUser(id);
}

public User ByName(string name) {
AuthorizationHelper.Instance.Authorize();
return _Data.ByName(name);
}
}

所以基本设置是:

  1. 创建接口(interface)
  2. 为实际实现该接口(interface)创建一个具体类
  3. 为该类创建一个包装器,在调用具体类之前执行相同的工作主体

鉴于这些类实现相同的接口(interface)并且在包装类中每个方法的开头完成完全相同的工作主体,这让我觉得我可以自动化这个包装过程。

我知道在 JavaScript 和 Python 中创建这样的装饰器是可能的。

JavaScript 示例:

function AuthorizedUserData() {
...
}

const userDataPrototype = Object.getPrototypeOf(new UserData());
Object.getOwnPropertyNames(userDataPrototype)
.forEach(name => {
const val = userDataPrototype[name];
if (typeof val !== 'function') {
return;
}

AuthorizedUserData.prototype[name] = function(...args) {
AuthorizationHelper.Authorize();
return this._Data[name](...args);
};
});

在 C# 中是否可以实现这种自动实现?

最佳答案

使用任何依赖注入(inject) (DI) 框架。下面一个使用 WindsorCaSTLe

使用nuget安装温莎城堡。

可以在您的场景中使用拦截器来拦截对方法的任何请求。

可以通过实现 IInterceptor 创建拦截器

public class AuthorizedUserData : IInterceptor
{
public void Intercept(IInvocation invocation)
{
//Implement validation here
}
}

使用 DI 容器注册依赖项并注册您的拦截器和类

var container = new WindsorContainer();
container.Register(Castle.MicroKernel.Registration.Component.For<AuthorizedUserData>().LifestyleSingleton());
container.Register(
Castle.MicroKernel.Registration
.Classes
.FromAssemblyInThisApplication()
.BasedOn<IUserData>()
.WithServiceAllInterfaces().Configure(
x => x.Interceptors<AuthorizedUserData>()));

你的类和接口(interface)结构如下

    public interface IUserData
{
User GetUser(uint id);
User ByName(string username);
}

public class UserData : IUserData
{
public User GetUser(uint id)
{
throw new System.NotImplementedException();
}

public User ByName(string username)
{
throw new System.NotImplementedException();
}
}


public class User
{

}

然后使用DI容器来解析你需要的实例。这里我们需要一个 IUserData

的实例
var user = container.Resolve<IUserData>(); // Creates an instance of UserData
user.ByName("userName"); //This call will first goto `Intercept` method and you can do validation.

关于c# - 自动实现装饰器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com