C#为所有其他类更改类的字段值

时间:2018-06-01 11:21:59

标签: c# dependency-injection properties

我有一个类(A类),它有一个名为methodA的方法。

class A
{
    public Dictionary<string, double> methodA(double param1, double param2)
    {
      //do calculations
      return result;
    }

}

我还有9个其他课程(B,C,......)。它们都有一个名为myField的字段。 myField的值是使用类A的methodA计算的。它们如下所示:

class B
{
    private Dictionary<string, double> myField;
    private readonly A a = new A();
    public B()
    {
        myField = a.methodA(param1, param2)
    }
    // methods using myField    
}

param1和param2是永不改变并存储在别处的值。因此,对于所有类和应用程序的完整运行时,myField的值都是相同的。现在有一个设计变化。 methodA更新并检查某个条件是否为真,并根据运行时期间正在更改的条件和参数param3,param4计算myField的值。

public Dictionary<string, double> methodA(double param1, double param2, double param3, double param4)
{
    if(condition)
    {
        result = .....
    } else {
        result = .....
    }      
    return result;
}

条件最初为false,并且在运行时期间仅更改一次。之后,myField的值应保持不变,直到运行结束。

我应该如何在我的类定义中实现它,以便myField的值在条件为真后更新一次并保持不变直到运行时结束?

2 个答案:

答案 0 :(得分:1)

您已将依赖注入添加为标记但尚未在示例中使用它。实现它并使A类成为一个注入服务(使用接口),它具有像单例一样的生命周期,然后将它注入到其他类中,瞧,你将拥有相同值的相同实例。以下是我通常的做法:

const endpoint = 'https://itunes.apple.com/search
term=jack+johnson&entity=song';
const searchInput = document.querySelector('.search');
const btn = document.querySelector('.btn-srch');
const paginationBtn = document.querySelector('.pagination');
const resultTile = document.querySelector('.container .row');

let songs = [];
paginationBtn.style.setProperty('display', 'none');
fetch(endpoint)
    .then(blob => blob.json())
    .then(data => songs = data.results);

function findSongs(wordToMatch, songs) {
    return songs.filter(title => {
        const regex = new RegExp(wordToMatch, 'gi');
        return title.trackName.match(regex) || title.artistName.match(regex);
    });
};

function displaySong() {
    const songsArray = findSongs(this.value, songs);
    console.log(songsArray);
    for(let i = 0; i < 8; i++) {
        const build = songsArray.map(title => {
            return `
           <div class="tile col-xs-12 col-sm-12 col-md-4">
                <div class="picture">
                    <img src="img/268x0w.jpg" alt="album picture" class="img-responsive">
                </div>
                <div class="text">
                    <h6 class="title">${title.trackName}</h6>
                    <span class="separator"></span>
                    <p class="author">${title.artistName}</p>
                </div>
            </div> 
         `;
        }).join('');
        resultTile.innerHTML = build;
    }
    if (songsArray.length >= 9) {
        console.log('more');
        paginationBtn.style.setProperty('display', 'flex');
    } else {
        paginationBtn.style.setProperty('display', 'none');
        }
};
    searchInput.addEventListener('change', displaySong);

然后神奇地将它传递给你的构造函数:

Container.RegisterType<IAPICacheManager, APICacheManager>(new ContainerControlledLifetimeManager());

以下是一个让您入门的示例: Unity

答案 1 :(得分:0)

如果myField的值必须在所有类中相同,我会考虑将其设为公共静态字段